Tag: 套接字

Java TCP套接字:数据传输速度很慢

我设置了一个带有ServerSocket的服务器,用客户机连接到它。 它们通过交换机直接联网,ping时间<1ms。 现在,我尝试通过套接字的输出流将“大量”数据从客户端推送到服务器。 转移0.6Gb需要23分钟。 我可以通过scp在几秒钟内推送一个更大的文件。 知道我可能做错了什么吗? 我基本上只是循环并在套接字上调用writeInt。 速度问题与数据的来源无关,即使我只是发送一个恒定的整数而不是从磁盘读取。 我尝试将两侧的发送和接收缓冲区设置为4Mb,没有骰子。 我为读写器使用缓冲流,没有骰子。 我错过了什么吗? 编辑:代码 这是我制作套接字的地方 System.out.println(“Connecting to ” + hostname); serverAddr = InetAddress.getByName(hostname); // connect and wait for port assignment Socket initialSock = new Socket(); initialSock.connect(new InetSocketAddress(serverAddr, LDAMaster.LDA_MASTER_PORT)); int newPort = LDAHelper.readConnectionForwardPacket(new DataInputStream(initialSock.getInputStream())); initialSock.close(); initialSock = null; System.out.println(“Forwarded to ” + newPort); // got my new port, […]

ServerSocket是否接受任意端口上的返回套接字?

我在java中看到了很多类似于这个问题的答案:“假设你在端口5000上有一个带有serversocket的服务器。客户端A和客户端B将连接到我们的服务器。 客户端A在端口5000上向服务器发送请求。客户端A侧的端口由操作系统选择。 通常,操作系统会选择下一个可用的端口。 此搜索的起点是先前使用的端口号+ 1(因此,例如,如果操作系统最近发生在我们的端口45546上,则操作系统将尝试45547)。 假设没有连接问题,服务器接收客户端A在端口5000上连接的请求。然后,服务器打开其自己的下一个可用端口,并将其发送到客户端。 在这里,客户端A连接到新端口,服务器现在再次使用端口5000。“ 我在stackoverflow上的多个问题中看到了类似的答案,关于如何在accept()的返回套接字中使用不同的端口,而不是ServerSocket正在侦听的端口。 我总是认为TCP由四方信息识别: 客户端IP:客户端端口和服务器IP:服务器端口 – >协议(用于区分TCP和UDP) 那么为什么accept()需要返回绑定到不同端口的套​​接字? 在每个标头中发送的四重信息是否能够区分来自不同机器的多个连接到同一服务器端口,而不需要在服务器计算机上使用不同的端口进行通信?

简单的Java客户端/服务器程序

我正在编写我的第一个java客户端/服务器程序,它只是建立与服务器的连接发送一个句子,服务器发回所有大写的句子。 这实际上是本书的一个例子,当我在同一台机器上运行客户端和服务器并使用localhost作为服务器地址时,它运行良好。 但是,当我将客户端程序放在另一台计算机上时,它会超时并且永远不会与服务器建立连接。 我不知道为什么会这样,而且它是一种蹩脚的制作你的第一个客户端/服务器程序而实际上无法在两台不同的机器上使用它。 这是客户端代码: import java.io.*; import java.net.*; public class TCPClient { public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket(“localhost”, 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + ‘\n’); modifiedSentence […]

创建一个允许通过线程和Java进行多个连接的套接字服务器

我试图调整我的简单套接字服务器,以便它可以有多个TCP连接,通过multithreading,但我似乎无法让它工作。 到目前为止,我的代码如下,我不确定从哪里开始: import java.net.*; import java.io.*; public class DoSomethingWithInput implements Runnable { private final Socket clientSocket; //initialize in const’r public void run() { BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String nextline; while ((nextline = in.readLine())!=null) { System.out.println(nextline); } //… close socket, etc. } } public class Socket{ public Socket() { } @Override public void run() […]

一个带Java / Socket的简单Http服务器?

我目前正在创建一个返回静态页面的小型HTTP服务器 Hello! …我尝试使用Java的套接字: public static void main(String[] args) throws Exception { // création de la socket int port = 1989; ServerSocket serverSocket = new ServerSocket(port); System.err.println(“Serveur lancé sur le port : ” + port); // repeatedly wait for connections, and process while (true) { // on reste bloqué sur l’attente d’une demande client Socket clientSocket […]

java.io.StreamCorruptedException:类型代码无效:00

所以基本上我正在写一个客户端 – 服务器多人游戏。 我有一个SeverCommunicationThread,如果他收到RequestForGame就会创建一个gameThread来创建gameThread。 当我发送一个RequestForGameexception时抛出java.io.StreamCorruptedException:无效的类型代码:00我假设它是因为两个线程都试图读取相同的ObjectInputStream,我对它的工作方式我不太了解,我只知道如何使用它。 你能帮我理解问题是什么以及如何解决? 谢谢 :) public class ServerCommunicationThread extends Thread{ private Socket connectionSocket; private ObjectInputStream inFromClient; private ObjectOutputStream outToClient; private String nickname; private ServerModelManager model; public ServerCommunicationThread(Socket connectionSocket, ServerModelManager model) throws IOException { this.connectionSocket = connectionSocket; inFromClient = new ObjectInputStream(connectionSocket.getInputStream()); outToClient = new ObjectOutputStream(connectionSocket.getOutputStream()); this.model = model; start(); } public void run() […]

如何在套接字通道中发送和接收序列化对象

我想通过套接字通道传输序列化对象。 我想把“好朋友”字符串作为序列化对象,然后在套接字通道中写入此对象,而在另一端我想读取相同的对象并检索数据。 我想用Java SocketChannel做的所有这些事情。 这个怎么做? 我尝试过如下,但没有在接收方获得任何数据。 private static void writeObject(Object obj, SelectionKey selectionKey) { ObjectOutputStream oos; try { SocketChannel channel = (SocketChannel) selectionKey.channel(); oos = new ObjectOutputStream(Channels.newOutputStream(channel)); oos.writeObject(obj); } catch (IOException ex) { ex.printStackTrace(); } } private static Object readObject(SelectionKey selectionKey) { ObjectInputStream ois; Object obj = new Object(); SocketChannel channel = (SocketChannel) selectionKey.channel(); try […]

向所有客户端发送消息(客户端 – 服务器通信)

所以现在,我正在制作一个基于multithreading的客户端服务器应用程序。 在服务器端,我为接受的单独连接创建了一个线程。 在线程类中,我创建了一个向客户端发送命令的方法。 我只想要的是,如何向所有正在运行的客户端发送参数? 对于简单的声明,我只想让这个服务器向所有连接的客户端发送消息。 我已阅读此帖并从此链接中找到sendToAll(String message)方法。 但是当我尝试使用我的代码时,在ServerSocket没有类似的方法。 好的,这是我的服务器和线程的示例代码。 class ServerOne{ ServerSocket server = null; … ServerOne(int port){ System.out.println(“Starting server on port “+port); try{ server = new ServerSocket(port); System.out.println(“Server started successfully and now waiting for client”); } catch (IOException e) { System.out.println(“Could not listen on port “+port); System.exit(-1); } } public void listenSocket(){ while(true){ ClientWorker […]

关闭Input / OutputStream和直接关闭Socket有什么区别?

我只是想知道当我们在inputStream上调用close并使用与套接字关联的outStream时java会做什么。 与套接字上的close调用有什么区别,即Socket.close()。 如果我们只关闭套接字上的io流,但不关闭套接字,我们可以再次重新打开套接字上的io流吗? 提前致谢!

使用Java在本地计算机上获取MAC地址

我可以用 ip = InetAddress.getLocalHost(); NetworkInterface.getByInetAddress(ip); 获取mac地址,但是如果我在离线机器中使用此代码则不起作用。 那么, 我怎样才能获得Mac地址?