gpt4 book ai didi

java - 全双工服务器套接字实现,单独的读写线程?

转载 作者:行者123 更新时间:2023-11-30 04:57:11 24 4
gpt4 key购买 nike

我想在同一个服务器套接字(java应用程序)上读取和写入(从服务器到客户端随机)。我的客户端到服务器的写入和读取在循环中工作得很好。在服务器上正确写入响应。

但是如果我尝试在服务器上随机写入一些命令。我没有解决方案,首先我的问题是:

  1. 服务器端是否可以在同一套接字上向客户端 ramonly 写入命令?
  2. 如果可能的话,有什么建议或指导如何做吗?
  3. 请给我一些指示,我可以在哪里阅读有关此场景的 Material ?

提前致谢。

public class ContentServerSocket extends ServerSocket {
private final static int PORT = 4444;

protected static boolean XYZGONE = false;
public static Content content;

public ContentServerSocket(xyzService service) throws IOException {
super(PORT);

while (true) {

Log.d(TAG, "Waiting for new request from client(content) ....");
new HandleRequest(accept(), service).start();
}
}

public static void xyzRunAway() {
Log.d(TAG," Content Serv er 1 ");
XYZGONE = true;
}

}

class HandleRequest extends Thread {
private final static String TAG = "ContentServerSocket:Thread for a request:";
private Socket client;
private xyzService service;

private static Context context;

HandleRequest(Socket client, SuggestionService service) {
this.client = client;
this.service = service;
context = xyzService.serviceContext();
}

public void run() {
while (true) {
try {

Log.d(TAG, " Step 1: client: Received request MSG for Check... ");
PrintWriter out = new PrintWriter(client.getOutputStream(),
true);

BufferedReader in = new BufferedReader(new InputStreamReader(
client.getInputStream(), "utf-8"));
String request = "";
String tmpLine = null;


Log.d(TAG, " Step Xyz waiting data from the client ... ");


while ((tmpLine = in.readLine()) != null) {

if (tmpLine.length() > 0) {
request += tmpLine;
//if (tmpLine.toLowerCase().contains("</contentInfo>")) {
if (tmpLine.contains("</contentInfo>")) {
Log.d(TAG, " Server : broke because of </contentInfo>");
break;
}
} else {
Log.d(TAG, " Step NULL : ");
request = "";
}

}



Log.d("Robin", " Step 2: Actual request received from the client : : " + request);
if (request.length() == 0) {
Log.d("Robin",
" client got 0 length request, thread stop!");
throw new Exception();

}
//XMLParser xmlParser = new XMLParser(new ByteArrayInputStream(
// request.getBytes("UTF-8")));

Log.d(TAG, " Step 3 : ");
RequestParser readxmlrequest = new RequestParser(request);
String requestType = readxmlrequest.parsingXmlRequestFromContent();
Log.d(TAG, " Step 4 requestType : " + requestType);


//TODO : need to get the result and pas to the out.println..

//String result = processXML(xmlParser);

String result = responseToContentRequest(readxmlrequest,requestType);//null; //TODO need to complete.
Log.d(TAG, " Step 5 result : "+result);
(((((((((())))))))))";
if (result != null && result.length() > 0) {

//oos.writeObject(result);
Log.d("Robin", " Writing response to socket ... ");
out.println(result + "\n");
out.flush();
Log.d("Robin", " Writing flush completed ");
}

if(ContentServerSocket.XYZGONE) {
Log.d(TAG," XYZGONE >>>>>>>> ");
ContentServerSocket.XYZGONE = false;
String tmp = "<ssr> OK Done .......</ssr>";
out.println(tmp + "\n");
Log.d("Content Server Socket ", "xyz:" + tmp);
out.flush();
}

} catch (IOException ioException) {
Log.d("Robin", " IOException on socket listen: " + ioException);
}
catch (Exception e) {
Log.d("Robin", " outer exception: " + e.toString());
break;
}

finally {
if (client == null || client.isClosed()
|| !client.isConnected()) {
Log.d(" Robin ", " client is null");
break;
}
}
//break;

}
Log.d("Robin", " thread stop... ");
}

最佳答案

所以,我修复了它。我只需要维护两个不同的线程。1)阅读。2)写入。

在上面的代码中,我刚刚又启动了一个用于写入的线程。

在上述代码的Run函数中插入代码。

================================================== =====

Runnable r1 = new Runnable() {
public void run() {
try {
while (true) {
System.out.println("Hello, world!");
if(ContentServerSocket.XYZGONE) {
Log.d(TAG," XYZGONEY >>>>>>>> ");
ContentServerSocket.XYZGONE = false;
String tmp = "<ssr> OK Done .......</ssr>";
out.println(tmp + "\n");
Log.d("Content Server Socket ", "XYZGONE :" + tmp);
out.flush();
}
Thread.sleep(1000L);
}
} catch (InterruptedException iex) {}
}
};

Thread thr1 = new Thread(r1);

======================================

然后在read的wile循环中启动线程。使用以下带有检查的代码。

======================================

if(!thr1.isAlive())thr1.start();

谢谢大家回答我的问题..

关于java - 全双工服务器套接字实现,单独的读写线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com