多线程TCP通信(客户端之间的数据共享)

来源:互联网 发布:手机淘宝可以删差评吗 编辑:程序博客网 时间:2024/06/05 16:57
1.创建服务端用作读取客户端的每一行内容,

并分享给每个客户端。

package chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.List;/** * 创建服务端用作读取客户端的每一行内容, * 并分享给每个客户端。 * @author soft01 * */public class Server_v3 {private ServerSocket server;private List<PrintWriter> allOut;public Server_v3() throws IOException {System.out.println("初始化服务端...");server = new ServerSocket(8088);allOut = new ArrayList<PrintWriter>();System.out.println("服务端初始化完毕");}public void start() {try {while(true) {System.out.println("等待客户端连接...");Socket socket = server.accept();System.out.println("已连接一个客户端");ClientHandler handler = new ClientHandler(socket);Thread t = new Thread(handler);t.start();}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {try {Server_v3 server = new Server_v3();server.start();} catch (Exception e) {e.printStackTrace();}}private class ClientHandler implements Runnable{private Socket socket;public ClientHandler(Socket socket) {this.socket=socket;}public void run() {PrintWriter pw = null;try {InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is, "utf-8");BufferedReader br = new BufferedReader(isr);OutputStream os = socket.getOutputStream();OutputStreamWriter osr = new OutputStreamWriter(os, "utf-8");pw = new PrintWriter(osr,true);synchronized(allOut) {allOut.add(pw);}System.out.println("当前在线人数:"+allOut.size()+"人");String str = null;while ((str= br.readLine())!=null) {System.out.println("客户端说"+str);synchronized(allOut) {for(PrintWriter o : allOut){o.println(str);}}}}catch(IOException e) {e.printStackTrace();}finally {synchronized(allOut) {allOut.remove(pw);System.out.println("一个用户下线了.");System.out.println("当前在线人数:"+allOut.size()+"人");}}}}}

2.读每一个客户端内容跟输入内容是用线程方式来实现的。

package chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.util.Scanner;/** * 读每一个客户端内容跟输入内容是用线程方式来实现的。 * @author soft01 * */public class Client_v3 {Socket socket;public Client_v3()  {try {System.out.println("初始化客户端...");socket = new Socket("localhost", 8088);System.out.println("客户端初始化完毕");} catch (IOException e) {e.printStackTrace();}}public void start() {try {ServerHandler handler = new ServerHandler();Thread t = new Thread(handler);t.start();OutputStream os = socket.getOutputStream();OutputStreamWriter osr = new OutputStreamWriter(os, "utf-8");PrintWriter pw = new PrintWriter(osr,true);Scanner scan = new Scanner(System.in);while (true) {String str = scan.nextLine();pw.println(str);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {try {Client_v3 client = new Client_v3();client.start();}catch(Exception e) {e.printStackTrace();}}private class ServerHandler implements Runnable{public void run() {try {InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is, "utf-8");BufferedReader br = new BufferedReader(isr);String str = null;while((str=br.readLine())!=null) {System.out.println(str);}}catch(IOException e) {e.printStackTrace();}}}}

阅读全文
0 0