这周学了蛮多东西,主要是面向网络方面,其中我觉得难度最大就是聊天室了,最开始思路有了,但具体实现最开始还是相当模糊,不知道怎么反复交互显示,我觉得这个项目还是蛮有代表意义的,涉及蛮多,有线程,网络,io流,时间类,一种交互思想等等
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/280a181909e6d457096945d02f2d8afc.png)
package com.softeem.lesson39.talking.hard.client;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.time.LocalDate;
import com.softeem.lesson39.talking.hard.comm.Tools;
public class MsgReceiver extends Thread{
private Socket s;
public MsgReceiver(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
BufferedReader br =null;
BufferedWriter bw = null;
try {
InputStream is = s.getInputStream();
InputStreamReader isr =new InputStreamReader(is);
br = new BufferedReader(isr);
String msg = null;
File f = new File("D:\\聊天记录\\"+Tools.host(s));
f.mkdirs();
File file = new File(f,LocalDate.now()+".txt");
OutputStream os = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(os);
bw =new BufferedWriter(osw);
while((msg = br.readLine())!=null) {
Tools.tips(msg);
bw.write(msg);
System.out.println();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(br!=null)bw.close();br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.softeem.lesson39.talking.hard.client;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import com.softeem.lesson39.talking.hard.comm.Tools;
public class SQClient {
private String ip;
private int port;
public SQClient(String ip, int port) {
super();
this.ip = ip;
this.port = port;
}
public void startChats() {
try {
Socket s = new Socket(ip, port);
MsgReceiver mr = new MsgReceiver(s);
mr.setDaemon(true);
mr.start();
Scanner sc = new Scanner(System.in);
OutputStream os = s.getOutputStream();
String msg= "";
while(!"quit".equals(msg)) {
msg = sc.nextLine();
Tools.sendMsg(os, msg);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new SQClient("192.168.7.118",8090).startChats();
}
}
package com.softeem.lesson39.talking.hard.comm;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.Date;
public class Tools {
public static void tips(String msg) {
System.out.println(msg);
}
public static String ip(Socket s) {
return s.getInetAddress().getHostAddress();
}
public static String time(long t) {
Date d = new Date(t);
SimpleDateFormat sdf = new SimpleDateFormat("[HH:mm:ss]");
return sdf.format(d);
}
public static String host(Socket s) {
return s.getInetAddress().getHostAddress();
}
public static void sendMsg(OutputStream os, String msg) {
PrintWriter pw = new PrintWriter(os);
pw.println(msg);
pw.flush();
}
}
package com.softeem.lesson39.talking.hard.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import com.softeem.lesson39.talking.hard.comm.Tools;
public class MsgServer extends Thread{
private Socket s;
public MsgServer(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
InputStream is = s.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String msg = null;
while((msg = br.readLine())!=null) {
for(Socket c :SQServer.clients) {
String content =Tools.time(System.currentTimeMillis())+" "+Tools.host(s)+":"+msg;
Tools.sendMsg(c.getOutputStream(), content);
}
}
} catch (IOException e) {
e.printStackTrace();
Tools.tips("客戶端断开连接"+Tools.ip(s));
SQServer.clients.remove(s);
}
}
}
package com.softeem.lesson39.talking.hard.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import com.softeem.lesson39.talking.hard.comm.Tools;
public class SQServer {
private int port;
public volatile static List<Socket> clients = new ArrayList<>();
public SQServer(int port) {
super();
this.port = port;
}
public void startServer() {
try {
ServerSocket server = new ServerSocket(port);
Tools.tips("服务已开启,等待连接...");
while(true) {
Socket s = server.accept();
clients.add(s);
Tools.tips("客户端已连接"+Tools.ip(s));
new TalkingServer(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new SQServer(8090).startServer();
}
}
package com.softeem.lesson39.talking.hard.server;
import java.io.IOException;
import java.net.Socket;
import com.softeem.lesson39.talking.hard.comm.Tools;
public class TalkingServer extends Thread{
private Socket s;
public TalkingServer(Socket s) {
this.s =s;
}
@Override
public void run() {
try {
Tools.sendMsg(s.getOutputStream(),"欢迎来到聊天室");
new MsgServer(s).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}