多个客户端使用Socket通过一个服务器进行交互的小例子
来源:互联网 发布:阿里云服务器加固 编辑:程序博客网 时间:2024/05/17 03:43
Client:
import java.awt.BorderLayout;import java.awt.Frame;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.Socket;import java.net.SocketException;import java.net.UnknownHostException;public class ChatClient extends Frame { private static final long serialVersionUID = 1L; private Socket socket;// 声明socket对象 private TextArea textArea = new TextArea();// 实例化文本域 private TextField textField = new TextField();// 实例化文本框 private DataOutputStream dos;// 输出字节流 private DataInputStream dis;// 输入字节流 private boolean isConnected;// 标记位,代表是否已经连接上 Thread thread = new Thread(new RecvThread());// 实例化接收其他客户端发送的消息线程 public static void main(String[] args) { new ChatClient().launchFrame(); } public void launchFrame() { setLocation(400, 300);// 设置位置 setSize(500, 500);// 设置大小 add(textArea, BorderLayout.NORTH); add(textField, BorderLayout.SOUTH); pack();// 组件自适应窗口 addWindowListener(new WindowAdapter() {// 添加窗口监听器,使用匿名类的方式实现 @Override public void windowClosing(WindowEvent e) { disConnect();// 关闭连接 System.exit(0);// 退出 } }); textField.addActionListener(new TFListener());// 为文本框注册监听事件 setVisible(true); connect(); thread.start();// 启动线程 } public void connect() { try { socket = new Socket("127.0.0.1", 64444); dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); isConnected = socket.isConnected(); System.out.print("LocalAddress->" + socket.getLocalAddress() + ",LocalPort" + socket.getLocalPort()); System.out.println("succeed connected!"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // TextField的监听器类 private class TFListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String content = textField.getText().trim(); String text = textArea.getText(); if (!"".equals(text)) text += "\n"; text += content;// 将内容重新拼接,主要是取出之前的内容,添加textField中的内容,然后重新显示 textArea.setText(text); textField.setText("");// 将textField文本框置空 try { dos.writeUTF(content);// 向服务器端输出信息 dos.flush();// 刷新缓冲区 } catch (IOException e1) { e1.printStackTrace(); } } } public void disConnect() { try { if (dos != null) dos.close(); if (socket != null) socket.close(); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } } private class RecvThread implements Runnable { public void run() { try { while (isConnected) { String str = dis.readUTF(); textArea.setText(textArea.getText() + str + "\n"); } } catch (SocketException e) { System.out.println("Good bye!" + e.getMessage()); } catch (EOFException e) { System.out.println("Good bye - bye!" + e.getMessage()); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); } } }}
Server:
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketAddress;import java.util.ArrayList;import java.util.List;public class ChatServer { static ServerSocket serverSocket; boolean isStarted = false;// 标志是否启动 List<Client> clients = new ArrayList<ChatServer.Client>(); public static void main(String[] args) { new ChatServer().start(); } public void start() { try { serverSocket = new ServerSocket(64444);// 在固定的端口上进行监听 isStarted = true; } catch (IOException e) { e.printStackTrace(); } try { while (isStarted) { Socket s = serverSocket.accept();// 接受连接请求 SocketAddress remoteSocketAddress = s.getRemoteSocketAddress(); System.out.println(remoteSocketAddress.toString()); System.out.println("a client connected!"); Client c = new Client(s);// 启动一个线程 new Thread(c).start(); clients.add(c);// 加入客户端集合,以便将消息群发给每一个客户端 } } catch (Exception e) { System.out.println(e.getMessage()); } finally { try { if (serverSocket != null) serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } class Client implements Runnable { private Socket socket; private boolean connected = false; private DataInputStream dataInputStream; private DataOutputStream dataOutputStream; public Client(Socket s) { this.socket = s; try { dataInputStream = new DataInputStream(socket.getInputStream()); dataOutputStream = new DataOutputStream(socket.getOutputStream()); connected = socket.isConnected(); System.out.println("connected = " + connected); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { String content = null; try { Client client = null; while (connected) { try { content = dataInputStream.readUTF(); System.out.println(content); System.out.println("clients.size()=>" + clients.size()); for (int i = 0; i < clients.size(); i++) { client = clients.get(i); // 分别向每一个客户端发消息 if (client != this) client.dataOutputStream.writeUTF(content); } } catch (EOFException e) { clients.remove(client);// 将客户端移出集合 System.out.println(e.getMessage()); System.out.println("Client closed!"); } } } catch (Exception e) { System.out.println(e.getMessage()); } finally { try { if (dataInputStream != null) dataInputStream.close(); if (dataOutputStream != null) { dataOutputStream.close(); } if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
0 0
- 多个客户端使用Socket通过一个服务器进行交互的小例子
- 使用socket实现服务器客户端即时通讯的小例子
- Android客户端与PC服务器通过socket进行交互实例
- Android客户端与PC服务器通过socket进行交互实例
- Android客户端与PC服务器通过socket进行交互实例
- Android客户端与PC服务器通过socket进行交互实例
- java Socket 一个服务器与多个客户端进行通信
- socket编程:服务器与客户端简单交互的例子
- 非阻塞socket对应的多线程服务器的实现---一个服务器如何与多个客户端进行通信?
- Java 的 Socket 服务器和客户端通信的例子 存在一个小问题
- 通过ssh客户端进行本地文件与服务器的交互
- 一个使用socket进行文件传输的例子
- 使用Socket进行一台服务器与多个Android客户端进行双向通信
- 使用Socket进行一台服务器与多个Android客户端进行双向通信
- java socket服务器客户端多线程小例子
- 一个 Java 的 Socket 服务器和客户端通信的例子
- 一个 Java 的 Socket 服务器和客户端通信的例子
- 一个 Java 的 Socket 服务器和客户端通信的例子
- poj 2777
- scanf()、getch()、getchar()、getc()、gets()
- 对C++中类的继承过程的理解
- 【翻译】利用加速度求解位置的算法——三轴传感器
- android屏幕长宽获取与android的学习经验小结
- 多个客户端使用Socket通过一个服务器进行交互的小例子
- nyoj-108 士兵杀敌
- Cocos2d-x游戏开发学习笔记
- ajax 学习
- php,java等语言的大小写问题总结
- hdu-2086-A1 = ?
- ios真机调试步骤
- java 语音基础
- Hdoj 1300 Pearls 【DP】