本实例实现了多客户端运行并进行聊天的功能 服务端聊天效果为:
客户端聊天效果:
服务器端代码:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class MyServer { private ServerSocket ss = null; private Boolean isConnected = false; private ChatThread chatThread[]; private int maxClient = 10; private int clientNum = 0; public MyServer() { } public static void main(String[] args) { new MyServer().startServer(); } private void startServer() { try { ss = new ServerSocket(8888, maxClient); isConnected = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (isConnected) { System.out.println("服務器上線了~"); } else { System.out.println("服務器沒上線~"); } if (isConnected) { chatThread = new ChatThread[maxClient]; for (int i = 0; i < maxClient; i++) { try { chatThread[i] = new ChatThread(ss.accept()); chatThread[i].start(); clientNum++; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } private class ChatThread extends Thread { private Socket socket = null; private String ip; private DataInputStream dis; private DataOutputStream dos; public ChatThread(Socket socket) { this.socket = socket; ip = socket.getInetAddress().toString(); ip = ip.replace("/", ""); System.out.println(ip + "上線了"); try { dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run() { while (isConnected) { try { String message = dis.readUTF(); System.out.println(ip + "说:\n" + message); for (int i = 0; i < maxClient; i++) { if (chatThread[i] != null) { chatThread[i].dos.writeUTF(ip + "说:\n" + message); chatThread[i].dos.flush(); } } } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println(ip + "下线了"); break; } } } } }客户端代码:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import javax.swing.JOptionPane; public class Client { private Socket s = null; private OutputStream os; private InputStream is; private String str = null; private Boolean isConnected = false; private DataInputStream dis; private DataOutputStream dos; public static void main(String[] args) { new Client().StartClient(); } private void StartClient(){ try { s = new Socket("192.168.1.100", 8888); isConnected = true; System.out.println("連接到服務器了"); dis = new DataInputStream(s.getInputStream()); dos = new DataOutputStream(s.getOutputStream()); new ClientThread().start(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private class ClientThread extends Thread{ public void run() { while (isConnected) { try { str = JOptionPane.showInputDialog("请输入要說的話:"); if (str != null) { dos.writeUTF(str); }else{ s.close(); isConnected = false; } String message = dis.readUTF(); System.out.println(message); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }