⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 java点对点客户端和服务器端
💻 JAVA
字号:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;

public class Server {
	static BufferedReader in;
	static PrintWriter pw;
	public static void main(String args[]){
		try {
			ServerSocket ss = new ServerSocket(3308);
			Map<String, Socket> map = new HashMap<String, Socket>();
			while (true) {
				Socket s = ss.accept();
				in = new BufferedReader(new InputStreamReader(s
						.getInputStream()));
				pw = new PrintWriter(s.getOutputStream());
				Set<String> set = map.keySet();
				StringBuilder sb = new StringBuilder("name");
				
				for (String name : set) {
					sb.append(":"+name);
				}
				String sss = sb.toString();
				pw.println(sss);
				pw.flush();
				
				String name = in.readLine();
				for(Socket socket:map.values()){//从这可以把新上线的人通知给已经在线的人
					pw = new PrintWriter(socket.getOutputStream());
					pw.println("1:"+name);//此为协议,1开头为上线操作
					pw.flush();
				}
				
				map.put(name, s);
				Thread t=new Xx(s,name,map);
				t.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}
class Xx extends Thread{
	Socket s;
	String name;
	Map<String,Socket> map;
	PrintWriter pw;
	public Xx(Socket s,String name,Map<String,Socket> map){
		this.s=s;
		this.name=name;
		this.map=map;
	}
@Override
	public void run(){
		try {
					BufferedReader in = new BufferedReader(new InputStreamReader(s
			.getInputStream()));
		while(true){
			String ss=in.readLine();
			
			String sss[]=ss.split(":");
			if(sss[0].equals("2")&&sss.length==2){//群发
				
				for(Socket socket:map.values()){
					pw = new PrintWriter(socket.getOutputStream());
					pw.println(name+"说:"+sss[1]);
					pw.flush();
				}
			}else if(sss[0].equals("1")&&sss.length==3){//点对点,只有相互的玩家能看到
				pw = new PrintWriter(s.getOutputStream());
				pw.println("我对"+sss[1]+"说:"+sss[2]);//自己屏幕上的显示
				pw.flush();
				pw=new PrintWriter(map.get(sss[1]).getOutputStream());
				pw.println(name+"对"+"我说:"+sss[2]);//别人屏幕上的显示
				pw.flush();
			}
		}
		} catch (Exception e) {//如果发生读取异常,则代表有玩家下线,以下为玩家下线后所做的操作
			map.remove(name);
			for(Socket socket:map.values()){
				try {
					pw = new PrintWriter(socket.getOutputStream());
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				pw.println("2:"+name);//此为协议,2开头则为下线操作
				pw.flush();
			}
		}
		
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -