Java 编写一个简单的客户端和服务端聊天室
一、创建客户端import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream
·
聊天室是一个利用网络编写的一个应用服务端程序
每个客户端先连接服务器,然后任意客户端发消息,都会经过服务器处理,然后服务器将消息分发个每个连接上的客户端
一、创建服务端
public class SimpleChatServer {
ArrayList clientOutPutStreams = new ArrayList();
public class ClientHandler implements Runnable
{
BufferedReader reader;
Socket socket;
public ClientHandler(Socket clientSocket)
{
try {
//与socket建立输入流
this.socket = clientSocket;
InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(inputStreamReader);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run()
{
String message = null;
try
{
//不断地从socket上读入数据
while ((message = reader.readLine()) != null)
{
System.out.println("read " + message);
//将数据发送给每一个客户端
tellEveryone(message);
}
}catch (Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new SimpleChatServer().go();
}
public void go()
{
try {
//服务器应用程序对特定的端口号创建ServerSocket
ServerSocket serverSocket = new ServerSocket(5000);
while (true)
{
//服务器创建出与客户端通信的socket
Socket clientSocket = serverSocket.accept();
//与socket建立输出流
PrintWriter printWriter = new PrintWriter(clientSocket.getOutputStream());
clientOutPutStreams.add(printWriter);
//开启一个线程
Thread thread = new Thread(new ClientHandler(clientSocket));
thread.start();
System.out.println("服务器得到一个连接");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void tellEveryone(String message)
{
Iterator it = clientOutPutStreams.iterator();
while (it.hasNext())
{
try
{
PrintWriter writer = (PrintWriter)it.next();
writer.println(message);
writer.flush();
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}
二、编写客户端A和B
public class SimpleChatClientA
{
JTextArea incoming; //文本域
JTextField outgoing; //输入框
BufferedReader reader; //缓冲输入字符流
PrintWriter writer; //输出字符流
Socket socket;
public static void main(String[] args)
{
new SimpleChatClientA().go();
}
public void go()
{
JFrame jFrame = new JFrame("simple chat clientA");
JPanel jPanel = new JPanel();
//创建文本域
incoming = new JTextArea(15,30);
incoming.setLineWrap(true); //设置在行过长的时候是否要自动换行
incoming.setWrapStyleWord(true); //设置在单词过长的时候是否要把长单词移到下一行
incoming.setEditable(false);
//创建滚动面板,并将文本域放入其中
JScrollPane jScrollPane = new JScrollPane(incoming);
jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//创建输入框
outgoing = new JTextField(20);
//创建发送按钮,并创建监听器
JButton sendButton = new JButton("send");
sendButton.addActionListener(new sendButtonListener());
//将上面组件放入JPanel容器中
jPanel.add(jScrollPane);
jPanel.add(outgoing);
jPanel.add(sendButton);
//与服务器建立连接
setUpNetworking();
//开启一个线程,并执行run方法
Thread thread = new Thread(new IncomingReader());
thread.start();
//将JPanel容器放入JFrame面板中
jFrame.getContentPane().add(BorderLayout.CENTER,jPanel);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400,400);
jFrame.setVisible(true);
}
/**
* 与服务器建立socket连接,并在socket的基础上建立输入、输出流
*/
private void setUpNetworking()
{
try {
//与服务器建立socket连接
socket = new Socket("127.0.0.1",5000);
//与socket建立字符输入缓冲流
InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(inputStreamReader);
//与socket建立字符输出流
writer = new PrintWriter(socket.getOutputStream());
incoming.append("客户端A 成功连接服务器......" + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 监听器
*/
class sendButtonListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
//当发送按钮点击,则触发事件,将输入框中的文字获取,并输出到服务器
writer.println("客户端A: " + outgoing.getText());
writer.flush();
//输入框文字清空
outgoing.setText("");
outgoing.requestFocus();
}
}
/**
* 该线程任务是不断地读取服务器的信息,并把它加载到文本域中
*/
class IncomingReader implements Runnable
{
@Override
public void run()
{
String message;
try {
while ((message = reader.readLine()) != null)
{
System.out.println("read " + message);
incoming.append(message + "\n");
}
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}
public class SimpleChatClientB
{
JTextArea incoming; //文本域
JTextField outgoing; //输入框
BufferedReader reader; //缓冲输入字符流
PrintWriter writer; //输出字符流
Socket socket;
public static void main(String[] args)
{
new SimpleChatClientB().go();
}
public void go()
{
JFrame jFrame = new JFrame("simple chat clientB");
JPanel jPanel = new JPanel();
//创建文本域
incoming = new JTextArea(15,30);
incoming.setLineWrap(true); //设置在行过长的时候是否要自动换行
incoming.setWrapStyleWord(true); //设置在单词过长的时候是否要把长单词移到下一行
incoming.setEditable(false);
//创建滚动面板,并将文本域放入其中
JScrollPane jScrollPane = new JScrollPane(incoming);
jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//创建输入框
outgoing = new JTextField(20);
//创建发送按钮,并创建监听器
JButton sendButton = new JButton("send");
sendButton.addActionListener(new sendButtonListener());
//将上面组件放入JPanel容器中
jPanel.add(jScrollPane);
jPanel.add(outgoing);
jPanel.add(sendButton);
//与服务器建立连接
setUpNetworking();
//开启一个线程,并执行run方法
Thread thread = new Thread(new IncomingReader());
thread.start();
//将JPanel容器放入JFrame面板中
jFrame.getContentPane().add(BorderLayout.CENTER,jPanel);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400,400);
jFrame.setVisible(true);
}
/**
* 与服务器建立socket连接,并在socket的基础上建立输入、输出流
*/
private void setUpNetworking()
{
try {
//与服务器建立socket连接
socket = new Socket("127.0.0.1",5000);
//与socket建立字符输入缓冲流
InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(inputStreamReader);
//与socket建立字符输出流
writer = new PrintWriter(socket.getOutputStream());
incoming.append("客户端B 成功连接服务器.........." + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 监听器
*/
class sendButtonListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
//当发送按钮点击,则触发事件,将输入框中的文字获取,并输出到服务器
writer.println("客户端B: " + outgoing.getText());
writer.flush();
//输入框文字清空
outgoing.setText("");
outgoing.requestFocus();
}
}
/**
* 该线程任务是不断地读取服务器的信息,并把它加载到文本域中
*/
class IncomingReader implements Runnable
{
@Override
public void run()
{
String message;
try {
while ((message = reader.readLine()) != null)
{
System.out.println("read " + message);
incoming.append(message + "\n");
}
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}
三、先开启服务端、在开启客户端A和B
客户端发送信息后,服务端会读取,然后分发给每个客户端
更多推荐
所有评论(0)