socket(非NIO)是阻塞的,这里使用多线程实现非阻塞即时通讯。每个请求都要创建个新的线程,资源消耗很大,适用于小数据量操作。包括四个文件:Server.java,Client.java,Send.java,Print.java.
1.Server.java:
package com.lcq.socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket serverSocket;
Socket socket;
try {
System.out.println("服务器启动。。。");
serverSocket = new ServerSocket(9000);
socket = serverSocket.accept();
System.out.println("服务端连接成功");
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
SendThread sendThread = new SendThread(dataOutputStream);
PrintThread printThread = new PrintThread(dataInputStream, "127.0.0.1");
Thread send = new Thread(sendThread);
Thread print = new Thread(printThread);
send.start();
print.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.Client.java
package com.lcq.socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 9000);
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
SendThread sendThread = new SendThread(dataOutputStream);
PrintThread printThread = new PrintThread(dataInputStream, "127.0.0.1");
Thread send = new Thread(sendThread);
Thread print = new Thread(printThread);
send.start();
print.start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.SendThread:
package com.lcq.socket;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
public class SendThread implements Runnable {
private DataOutputStream dataOutputStream;
public SendThread(DataOutputStream dataOutputStream) {
super();
this.dataOutputStream = dataOutputStream;
}
@Override
public void run() {
BufferedReader bufferedReader = null;
while (true) {
try {
bufferedReader = new BufferedReader(new InputStreamReader(
System.in));
String line = bufferedReader.readLine();
if (line != null) {
dataOutputStream.writeUTF(line);
}
} catch (Exception e) {
break;
}
}
}
}
4.Print.java:
package com.lcq.socket;
import java.io.DataInputStream;
import java.io.IOException;
public class PrintThread implements Runnable{
private String ip = null;
private DataInputStream dataInputStream;
public PrintThread(DataInputStream dataInputStream,String ip){
super();
this.dataInputStream = dataInputStream;
this.ip = ip;
}
@Override
public void run() {
while(true){
try {
String line = dataInputStream.readUTF();
System.out.println(ip+":"+line);
} catch (IOException e) {
break;
}
}
}
}