基于java socket编写的超简版聊天室,支持双人在线聊天。代码量非常小,功能简单。每个客户端由两个线程组成,发送线程和接收线程。
ip地址和端口号硬编码了,感兴趣的朋友可以自己改进程序。
package com.sjh.net;
import org.junit.Test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Chat {
public class Send extends Thread {
String addr;
int port;
public Send(String addr, int port) {
super();
this.addr = addr;
this.port = port;
}
@Override
public void run() {
super.run();
try {
Scanner scanner = new Scanner(System.in);
Socket socket = null;
while (true) {
try {
socket = new Socket(addr, port);
break;
} catch (Exception e) {
System.out.println("连接失败");
try {
Thread.sleep(500);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
}
}
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
while (true) {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
System.err.println(socket.getInetAddress().getHostName() + " " + format);
dataOutputStream.writeUTF(scanner.nextLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Reveice extends Thread {
int port;
public Reveice(int port) {
super();
this.port = port;
}
@Override
public void run() {
super.run();
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket accept = serverSocket.accept();
System.out.println("连接成功");
while (true) {
DataInputStream dataInputStream = new DataInputStream(accept.getInputStream());
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
System.err.println(accept.getInetAddress().getHostName() + " " + format);
System.out.println("" + dataInputStream.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void client1() throws IOException {
Reveice reveice = new Reveice(9090);
reveice.start();
System.out.println("客户端已启动");
Send send = new Send("localhost", 8080);
try {
System.out.println("尝试连接....");
send.run();
} catch (Exception e) {
}
}
@Test
public void client2() throws IOException {
Reveice reveice = new Reveice(8080);
reveice.start();
System.out.println("客户端已启动");
Send send = new Send("localhost", 9090);
try {
System.out.println("尝试连接....");
send.run();
} catch (Exception e) {
System.out.println("连接失败");
}
}
}
注意:idea的@Test单元不支持控制台输入。
找到IDEA的bin目录下的idea64.exe.vmoptions文件,在文件尾部加入这句保存后重启IDEA即可
-Deditable.java.test.console=true