服务器端:
//程序的入口
public static void main(String[] args) throws IOException {
//1.创建服务器--括号里是一个端口号,只要没有被占用就行
ServerSocket server = new ServerSocket(8118);
System.out.println("大明星们正在加入聊天室...");
//map集合保存客户端名字--String是名字--PrintWriter是发送的信息
Map<String, PrintWriter> map=new HashMap<>();
//2.只要有一个人访问,就要和她连接(启一次就关了,所以要用到无限循环,每次有人进来都能访问)--此处抛出一个IO异常
while(true) {
//每个人俩天,都有唯一的socket
Socket socket = server.accept();//类似于一个阻塞
//多个人聊天,需要使用多线程
Thread t1=new Thread(new Server_Thread(socket,map));
t1.start();
}
}
客户端1:可以重复写几个客户端
//1.创建一个客户端---localhost是本机
Socket zhouxinchi=new Socket("localhost",8118);
//客户端要想和服务器读和写-1.得到输出流-2.得到输入流
// 如果直接读写,代码按顺序执行-如果读不了就不能写(别人发了消息可能没有回)
//得到输出流
InputStream is=zhouxinchi.getInputStream();
//得到输入流
OutputStream os= zhouxinchi.getOutputStream();
//通过线程来解决代码按顺序执行--1.读线程
Thread t1=new ReadToServer_Thread("周星驰",is);
//写线程
Thread t2=new WriteToServer_Thread("周星驰",os);
t2.start();
t1.start();
可以写一个客户端读写的线程让客户端调用:
public class ReadToServer_Thread extends Thread{
/*
客户端读服务器
*/
public String name;
public InputStream is;
public ReadToServer_Thread(String name,InputStream is){
this.name=name;
this.is=is;
}
//
public void run(){
//先转为一次读一行
try {
BufferedReader br=new BufferedReader(
new InputStreamReader(is,"utf-8"));
String line;
while((line= br.readLine())!=null){
System.out.println(line);//打印到控制台
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public class WriteToServer_Thread extends Thread {
/*
客户端写的线程
*/
public String name;
public OutputStream os;
//构造器
public WriteToServer_Thread(String name,OutputStream os){
this.name=name;
this.os=os;
}
public void run(){
//一行一行的输入
try {
//用键盘扫描器输入
Scanner key=new Scanner(System.in);
PrintWriter pw=new PrintWriter(new OutputStreamWriter
(os,"utf-8"),true);
//可以先写入自己的名字,再无限输入
pw.println(name);
pw.println("加入了聊天室了");
while (true){
String line=key.nextLine();
pw.println(line);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
服务器多线程的实现过程:
public class WriteToServer_Thread extends Thread {
/*
客户端写的线程
*/
public String name;
public OutputStream os;
//构造器
public WriteToServer_Thread(String name,OutputStream os){
this.name=name;
this.os=os;
}
public void run(){
//一行一行的输入
try {
//用键盘扫描器输入
Scanner key=new Scanner(System.in);
PrintWriter pw=new PrintWriter(new OutputStreamWriter
(os,"utf-8"),true);
//可以先写入自己的名字,再无限输入
pw.println(name);
pw.println("加入了聊天室了");
while (true){
String line=key.nextLine();
pw.println(line);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
客户端读写用到的流:
public class client_R_W {
String name;
Socket soc;
public client_R_W() {
}
public void WR(String name, Socket soc) throws IOException {
//读线程
Thread t1=new ReadToServer_Thread(name,soc.getInputStream());
//写线程
Thread t2=new WriteToServer_Thread(name,soc.getOutputStream());
//启动线程
t1.start();
t2.start();