Java 我只想在客户端第一次连接时从多线程服务器发送一个字符串
我开发了一个多线程服务器,运行良好但是现在我想让它第一次发送一个客户端连接一个字符串,然后继续执行相同的常规过程,接收一个字符串并发送一个文件! 这是我的服务器代码Java 我只想在客户端第一次连接时从多线程服务器发送一个字符串,java,multithreading,tcp,java-server,Java,Multithreading,Tcp,Java Server,我开发了一个多线程服务器,运行良好但是现在我想让它第一次发送一个客户端连接一个字符串,然后继续执行相同的常规过程,接收一个字符串并发送一个文件! 这是我的服务器代码 import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.util.Scanner; class TCPServer { public static void main(String argv[]) throws Excepti
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.util.Scanner;
class TCPServer {
public static void main(String argv[]) throws Exception {
System.out.println("Welcome to the stream Server");
System.out.println("listening to Clients");
ServerSocket welcomeSocket = new ServerSocket(3248);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
if (connectionSocket != null) {
Client client = new Client(connectionSocket);
client.start();
}
}
}
}
class Client extends Thread {
private Socket connectionSocket;
public Client(Socket c) throws IOException {
connectionSocket = c;
}
public void run() {
String path = "C:/pao/new2/";
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
try {
String fileToSendStr = readFile();
File fileToSend = null;
for (File f : listOfFiles)
{
if (f.getName().equals(fileToSendStr)) {
fileToSend = f;
break;
}
}
System.out.println("Connecting to Client to recieve the part " +fileToSendStr);
if (fileToSend == null) {
}
System.out.println("Sending the chunk to Client");
long length = fileToSend.length();
byte [] longBytes = new byte[8];
ByteBuffer bbuffer = ByteBuffer.wrap(longBytes);
bbuffer.putLong(length);
connectionSocket.getOutputStream().write(longBytes);
BufferedOutputStream bout = new BufferedOutputStream(connectionSocket.getOutputStream());
BufferedInputStream bain = new BufferedInputStream(new FileInputStream(fileToSend));
byte buffer [] = new byte [1024];
int i = 0;
while((i = bain.read(buffer, 0, 1024)) >= 0){
bout.write(buffer, 0, i);
}
System.out.println("chunk sended");
bout.close();
bain.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private String readFile() throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(
connectionSocket.getInputStream()));
return r.readLine();
}
}
客户端希望建立连接的部分与它建立连接的部分不同。只想第一次检索字符串,然后该部分就不再可访问了 ServerSocket.accept()
是一种阻塞方法。如果未建立连接或出现超时(以前设置),则不会返回
将服务器代码放在客户端实例化的单独线程中,或为套接字设置超时:
ServerSocket welcomeSocket = new ServerSocket(3248);
welcomeSocket.setSoTimeout(2000); // waits 2 seconds for a client.
while (true) {
(new Thread(new Runnable() {
public void run() {
Socket connectionSocket = welcomeSocket.accept();
if (connectionSocket != null) {
Client client = new Client(connectionSocket);
client.start();
}
}
})).start();
try {
welcomeSocket.accept();
} catch(Exception e) {
//socket timeout.
}
}
我不确定我是否理解得很好,但你说目前服务器运行良好,可以为客户端提供服务。您想知道的是以前是否已经连接了客户端?服务器和客户端之间的通信跨越多个连接 这需要概念性思维。 如果您在HTTPLand,这将意味着某种会话和/或cookie概念。通过cookie,服务器可以在客户端存储信息(上次客户端连接时,某种状态)。通过会话id,您可以跟踪与客户端通信期间的状态 在您的情况下,您可能需要开发一个非常简单的应用程序级协议(ISO/OSI网络堆栈的顶部)。例如,在连接建立之后,客户机将向服务器发送一个字节,告知信息交换的阶段,然后服务器将根据该阶段做出反应。在通信结束时,该“状态”参数将被更新、修改
这有帮助吗?看,客户机现在来了,发送一个字符串,然后接收一个文件!!我希望客户端在连接时不连接发送,但仅在第一次连接接收字符串!在那之后,连接并做它必须做的事情!我认为这仍然是一个概念上的两难选择。服务器如何知道某个客户机现在只想读取?它必须从某个地方知道。在某个地方,应该保存和检查上一次与客户机的通信会话的历史/阶段。据我所知。除此之外,TCP套接字是全双工通信信道。由客户机和服务器自己决定和协商何时以及谁将通过“管道”发送和接收数据。通过给welcomeSocket一个超时,我将获得什么!跳出圈子?但是我需要重新启动服务器!是的,它将抛出一个异常。你需要抓住它。除此之外,您还应该将接受连接的线程与创建客户端的线程的客户端分离。