java tcp协议传输,客户端怎么判断,服务端有没有来消息...,通过循环读取响应流吗?
其实我就是想了解网络模式,客户端是怎么接收消息的,通过阻塞,当有消息时,就读取,还是通过循环一直读取响应流.......
其实我就是想了解网络模式,客户端是怎么接收消息的,通过阻塞,当有消息时,就读取,还是通过循环一直读取响应流....
展开
1个回答
展开全部
给你一个简单的例子,这样就是客户端不停的接收消息,你说的对,是通过循环在一直的读取。
---------------------------------------------------------------------------
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ScoketTest {
public static void main(String[] args) throws Exception {
new Server().start();
new Client().start();
}
}
class Server extends Thread {
private ServerSocket server = null;
public Server() throws Exception {
server = new ServerSocket(8888);
}
public void run() {
try {
while (true) {
Socket client = server.accept();
OutputStream out = client.getOutputStream();
out.write("server to client : hello".getBytes());
out.flush();
out.close();
client.close();
sleep(1000);
}
} catch (Exception e) {
System.out.println("server : " + e.getMessage());
}
}
}
class Client extends Thread {
public void run() {
try {
while (true) {
Socket client = new Socket("localhost", 8888);
InputStream in = client.getInputStream();
byte[] buff = new byte[4096];
StringBuffer sbuff = new StringBuffer();
int len = 0;
while ((len = in.read(buff)) != -1) {
sbuff.append(new String(buff, 0, len));
}
in.close();
client.close();
System.out.println(sbuff.toString());
sleep(1000);
}
} catch (Exception e) {
System.out.println("client : " + e.getMessage());
}
}
}
---------------------------------------------------------------------------
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ScoketTest {
public static void main(String[] args) throws Exception {
new Server().start();
new Client().start();
}
}
class Server extends Thread {
private ServerSocket server = null;
public Server() throws Exception {
server = new ServerSocket(8888);
}
public void run() {
try {
while (true) {
Socket client = server.accept();
OutputStream out = client.getOutputStream();
out.write("server to client : hello".getBytes());
out.flush();
out.close();
client.close();
sleep(1000);
}
} catch (Exception e) {
System.out.println("server : " + e.getMessage());
}
}
}
class Client extends Thread {
public void run() {
try {
while (true) {
Socket client = new Socket("localhost", 8888);
InputStream in = client.getInputStream();
byte[] buff = new byte[4096];
StringBuffer sbuff = new StringBuffer();
int len = 0;
while ((len = in.read(buff)) != -1) {
sbuff.append(new String(buff, 0, len));
}
in.close();
client.close();
System.out.println(sbuff.toString());
sleep(1000);
}
} catch (Exception e) {
System.out.println("client : " + e.getMessage());
}
}
}
更多追问追答
追问
你是觉得这种循环模式好,还是server.accept();而采用这种模式,又只有ServerSocket对象才拥有,在客户端又怎么能用ServerSocket对象呢,举个例子,两个人聊天,我发一条消息到服务器,服务器接收,再转到另一个客户端,另一个客户端怎么判断消息有没有来,怎么判断?
你这例子,不明确啊,我知道怎么写,我现在想了解设计模式,你这个客户端有问题啊,Socket 会占用端口的,你这不停的new,即时响应回来了,你也收不到啊.
追答
1.你这例子,不明确啊,我知道怎么写,我现在想了解设计模式
1.如果你直接发你追问这样的问题,我也不会贴代码。
2.你这个客户端有问题啊,Socket 会占用端口的,你这不停的new,即时响应回来了,你也收不到啊.
2.你没有运行试过吗?这是你臆断的吧。因为每一个都close掉了,不会出现 占有用端口的问题。
这个例子不好的地方就是不停的在new,
但是客户端的流,如果不关闭,就得不到新的流,这时才是真的收不到即时响应,关闭了流,socket也同时关了。我暂进也没想到怎么处理,就这样每次都NEW,
别人给你的代码你运行一下,而不是主观臆测。
3.举个例子,两个人聊天,我发一条消息到服务器,服务器接收,再转到另一个客户端,另一个客户端怎么判断消息有没有来,怎么判断?
3.这个没有什么怎么判断的,通信功能都是这样的线程,隔一段时间就去服务器端取一次,服务器端发给你消息了,就是来消息了呀。
4.你是觉得这种循环模式好,还是server.accept();而采用这种模式
4.对这个问题不是很明白你想问什么,server.accept() 这个是server等待客户端的连接。如果不用循环的方式,那这个方法执行完,这个线程不也就结束了吗?怎么再进行下次通信呢?这个问题,你再详细说一下,我没看懂。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询