您的位置:首页 > 其它

socket 非阻塞即时通讯

2016-06-28 17:09 225 查看
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;
}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: