#TCP协议实现类似于qq聊天,我想实现一直对话的效果,但是客户端发送一个以后,服务器端一直收不到,也不关闭!
#客户端代码如下:
public class Tclicent {
public void chatc() {
try {
Socket soc = new Socket( "192.168.3.48",100);
try {
InputStream i1 = soc.getInputStream();
InputStreamReader i2 = new InputStreamReader(i1);
BufferedReader b1 = new BufferedReader(i2);
BufferedWriter b2 = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
Scanner sc = new Scanner(System.in);
while (true) {
String s = sc.nextLine();
System.out.println("客户端" + s);
b2.write(s+"\n");
String s1 = b1.readLine();
System.out.println(s1);
}
} finally {
soc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
#服务器端代码如下:
public class Tserver {
public void chats() {
try {
ServerSocket ser = new ServerSocket(100);
Socket accept = ser.accept();
try {
InputStream i1 = accept.getInputStream();
InputStreamReader i2 = new InputStreamReader(i1);
BufferedReader b1 = new BufferedReader(i2);
BufferedWriter b2 = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
Scanner sc = new Scanner(System.in);
while (true) {
String s = b1.readLine();
System.out.println(s);
String s1 = sc.nextLine();
System.out.println("客户端:" + s1);
b2.write(s1+"\n");
}
} finally {
ser.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端要创建并启用线程接收数据。
检查防火墻,另外,server 试试用 admin 起,1024以下的 port应该不是普通账户能起得了
起来 server 用 netstat 看看是不是在监听
接收到一个客户端的accept()后,你要开一个线程去维护这个长连接才能正常通讯
这是BIO服务端的模板代码
public class BIOServer {
public static void main(String[] args) throws Exception {
//创建线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
//创建Socket 9999端口
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端:服务端启动成功,线程信息 ID="+Thread.currentThread().getId()+" Name="+Thread.currentThread().getName());
while (true){
//死循环监听客户端连接
System.out.println("服务端:阻塞,等待新客户端连接");
final Socket socket = serverSocket.accept();
//创建一个线程和客户端通信
threadPool.execute(new Runnable() {
public void run() {
System.out.println("服务端:连接到一个客户端,线程信息 ID="+Thread.currentThread().getId()+" Name="+Thread.currentThread().getName());
handler(socket);
}
});
}
}
//一个Handler方法用于处理客户端消息
public static void handler(Socket socket){
try {
//创建一个byte数组用于接受数据
byte[] bytes = new byte[1024];
//从socket获取当前客户端的流
InputStream inputStream = socket.getInputStream();
//循环读取客户端的流
while (true){
System.out.println("服务端:阻塞,等待客户端发送数据,线程信息 ID="+Thread.currentThread().getId()+" Name="+Thread.currentThread().getName());
int read = inputStream.read(bytes);
//如果read不是-1表示有数据 把当前读取的内容打印出来
if (read != -1){
System.out.println("接受到客户端消息:"+new String(bytes,0,read));
}else {//否则就退出循环
break;
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("服务端:关闭和client的连接");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}