聊天室案例(TCP通信)

服务器端
1、新建1个服务器类,3个属性
List:用来存储客户端发送的信息
ExecutorService :线程池用来建立和多个客户端的同步连接
ServerSocket :TCP连接

// An highlighted block
public class Server {
	private static ServerSocket serversocket;
	private static List<PrintWriter> list;
	private static ExecutorService threadpool;
	public Server(){
		try {
			list=new ArrayList<PrintWriter>();
			threadpool=Executors.newFixedThreadPool(50);
			serversocket=new ServerSocket(8088);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static ServerSocket getServersocket() {
		return serversocket;
	}

	public static void setServersocket(ServerSocket serversocket) {
		Server.serversocket = serversocket;
	}

	public static List<PrintWriter> getList() {
		return list;
	}

	public static void setList(List<PrintWriter> list) {
		Server.list = list;
	}

	public static ExecutorService getThreadpool() {
		return threadpool;
	}

	public static void setThreadpool(ExecutorService threadpool) {
		Server.threadpool = threadpool;
	}
}

2、写个start方法,用来建立连接,和客户端交互

// An highlighted block
public void ServerStart(){
		try {
			//循环与客户端交互
			System.out.println("客户端正在连接。。。。");
			while(true){
			Socket socket=serversocket.accept();//客户端连接
			System.out.println("客户端连接成功");
			//启动线程池,与客户端交互
			ClientHander hander=new ClientHander(socket);
			threadpool.execute(hander);
		}
		} catch (Exception e) {
			e.printStackTrace();
		
		}	
	}
	static class ClientHander implements Runnable{
		private Socket socket;
		public ClientHander(Socket socket){
			this.socket=socket;
		}
		@Override
		public void run() {
			PrintWriter pw = null;
			try {
				//将发送给客户端的输出流存入集合
				OutputStream os=socket.getOutputStream();
				OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
				pw= new PrintWriter(osw,true);
				addOut(pw);
				//从客户端读入输入流
				InputStream is=socket.getInputStream();
				InputStreamReader isr = new InputStreamReader(is);
				BufferedReader br = new BufferedReader(isr);
				String message = null;
				while((message = br.readLine())!=null){
					sendmessage(message);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			finally{
				removeOut(pw);
				if(socket!=null){
					try{
						socket.close();
					}catch(IOException e){
						e.getStackTrace();
					}
				}
			}
		}
	}

3、/定义添加、删除、发送信息方法

// An highlighted block
public synchronized static void addOut(PrintWriter out){
		list.add(out);
	}
public synchronized static void removeOut(PrintWriter out){
	list.remove(out);
}
public synchronized static void sendmessage(String message){
	for(PrintWriter p : list){
		p.println(message);
	}
}

4、最后main方法,构造一个服务器类,然后执行类方法

// An highlighted block
public static void main(String[] args) {
		Server server=new Server();
		server.ServerStart();
	}

服务器端完整代码

// An highlighted block
package test.testsocket;

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;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {
	private static ServerSocket serversocket;
	private static List<PrintWriter> list;
	private static ExecutorService threadpool;
	public Server(){
		try {
			list=new ArrayList<PrintWriter>();
			threadpool=Executors.newFixedThreadPool(50);
			serversocket=new ServerSocket(8088);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static ServerSocket getServersocket() {
		return serversocket;
	}

	public static void setServersocket(ServerSocket serversocket) {
		Server.serversocket = serversocket;
	}

	public static List<PrintWriter> getList() {
		return list;
	}

	public static void setList(List<PrintWriter> list) {
		Server.list = list;
	}

	public static ExecutorService getThreadpool() {
		return threadpool;
	}

	public static void setThreadpool(ExecutorService threadpool) {
		Server.threadpool = threadpool;
	}

	public void ServerStart(){
		try {
			//循环与客户端交互
			System.out.println("客户端正在连接。。。。");
			while(true){
			Socket socket=serversocket.accept();//客户端连接
			System.out.println("客户端连接成功");
			//启动线程池,与客户端交互
			ClientHander hander=new ClientHander(socket);
			threadpool.execute(hander);
		}
		} catch (Exception e) {
			e.printStackTrace();
		
		}	
	}

	static class ClientHander implements Runnable{
		private Socket socket;
		public ClientHander(Socket socket){
			this.socket=socket;
		}
		@Override
		public void run() {
			PrintWriter pw = null;
			try {
				//将发送给客户端的输出流存入集合
				OutputStream os=socket.getOutputStream();
				OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
				pw= new PrintWriter(osw,true);
				addOut(pw);
				//从客户端读入输入流
				InputStream is=socket.getInputStream();
				InputStreamReader isr = new InputStreamReader(is);
				BufferedReader br = new BufferedReader(isr);
				String message = null;
				while((message = br.readLine())!=null){
					sendmessage(message);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			finally{
				removeOut(pw);
				if(socket!=null){
					try{
						socket.close();
					}catch(IOException e){
						e.getStackTrace();
					}
				}
			}
		}
	}
	//定义添加、删除、发送信息方法
	public synchronized static void addOut(PrintWriter out){
		list.add(out);
	}
	public synchronized static void removeOut(PrintWriter out){
		list.remove(out);
	}
	public synchronized static void sendmessage(String message){
		for(PrintWriter p : list){
			p.println(message);
		}
	}
	public static void main(String[] args) {
		Server server=new Server();
		server.ServerStart();
	}
}

客户端

// An highlighted block
package test.testsocket;

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;

public class Client {
	private static Socket socket;
	public static void main(String[] args){
		Client client=new Client();
		client.start();
	}
	public Client() {
		try {
		//建立和服务器的连接
			socket =new Socket("localhost",8088);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void start(){	
		try {
			ServerHander hander=new ServerHander();
			Thread t=new Thread(hander);
			t.setDaemon(true);
			t.start();
			//发送信息至服务端
			OutputStream os=socket.getOutputStream();
			OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
			PrintWriter pw=new PrintWriter(osw,true);
			Scanner s=new Scanner(System.in);
			while(true){
				pw.println(s.nextLine());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			if(socket!=null){
				try{
					socket.close();
				}catch(IOException e){
					e.getStackTrace();
				}
			}
		}
	}
	static class ServerHander implements Runnable{
		@Override
		public void run() {
			try {
				//接受服务端发送的信息
				InputStream is=socket.getInputStream();
				InputStreamReader isr=new InputStreamReader(is,"UTF-8");
				BufferedReader br=new BufferedReader(isr);
				while(true){
					System.out.println(br.readLine());
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}	
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值