在学习网络编程的时候,实现了简单的聊天室功能,但是,此聊天室只能以如下流程实现:
客户端发送消息 —> 服务器端接收消息 —> 服务器端发送消息 —> 接收端接收消息
代码如下
1.服务器端
package testttt;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Sever1 {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
//监听客户端连接
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
DataInputStream dataInput = new DataInputStream(in);
DataOutputStream dataOut = new DataOutputStream(out);
Scanner sc = new Scanner(System.in);
while (true){
String m = dataInput.readUTF();
System.out.println("来自客户端的消息:"+m);
System.out.println("服务器端输入:");
String msg = sc.next();
dataOut.writeUTF(msg);
}
}
}
2.客户端
package testttt;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client1 {
public static void main(String[] args) throws IOException {
//监听客户端连接
Socket socket = new Socket("127.0.0.1", 9999);
Scanner sc = new Scanner(System.in);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
DataInputStream dataInput = new DataInputStream(in);
DataOutputStream dataOut = new DataOutputStream(out);
while (true){
System.out.println("客户端输入:");
String msg = sc.next();
dataOut.writeUTF(msg);//输出一个字符串
String m = dataInput.readUTF();
System.out.println("服务器端消息:"+m);
dataInput.close();
dataOut.close();
}
}
}
那么怎么实现类似于微信聊天那种无论那一方发送多少的消息,另一方都可以接收并输出呢?
代码如下
1.发送类
package Demo;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class SendThread extends Thread{
private Socket socket;
private DataOutputStream out;
public SendThread(Socket socket) throws IOException {
this.socket = socket;
this.out = new DataOutputStream(socket.getOutputStream());
}
@Override
public void run() {
Scanner sc = new Scanner(System.in);
while(true){
String s = sc.next();
if(socket.isClosed()||s.equals("886")){
break;
}
try {
out.writeUTF(s);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.接收类
package Demo;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class ReciveThread extends Thread{
private Socket socket;
private DataInputStream in;
public ReciveThread(Socket socket) throws IOException {
this.socket = socket;
this.in = new DataInputStream(socket.getInputStream());
}
@Override
public void run() {
while(true){
try {
String s = this.in.readUTF();
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
此时只需要在服务器端和客户端new对象就行了
3.服务器端
package Demo;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Sever {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
new SendThread(socket).start();
new ReciveThread(socket).start();
}
}
4.客户端
package Demo;
import java.io.IOException;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",9999);
new SendThread(socket).start();
new ReciveThread(socket).start();
}
}
如图所示
1.服务器端
2.客户端