Tag: 套接字

Java swing的GUI冻结

我正在编写一个使用套接字的Java客户端/服务器GUI应用程序,这里是问题: 我有一个button来开始监听指定的端口: buttonactionPerformed方法 private void listenButtonActionPerformed(java.awt.event.ActionEvent evt) { int port = Integer.parseInt(portTextfield.getText(), 10); try { socket.listen(port); } catch (IOException ex) { } } 这里是socket.listen方法 public static void listen() throws IOException { ServerSocket ss = new ServerSocket(port); while (true) new socket(ss.accept()); } “套接字”类扩展“线程” 所以在ss.accept()返回一个值之后,它会在单独的线程中创build新的套接字实例。 点击button后,GUI会冻结,因为在socket.listen方法中存在无限循环。 我怎样才能避免呢?

现有的连接被远程主机强制closures

我正在与一个商业应用程序抛出一个SocketException与消息, 现有的连接被远程主机强制closures 这发生在客户端和服务器之间的套接字连接。 这个连接还活着,而且数据正在被传输,但是却不知从何处断开。 有没有人看过这个? 原因是什么? 我可以猜出一些原因,但是还有什么办法可以添加更多的代码来找出原因可能是什么? 任何意见/想法都欢迎。 … 最新的 … 我有一些logging从一些.NET跟踪, System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send – An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0 根据日志logging的其他部分,我已经看到它说“0#0”意味着正在发送一个0字节长度的数据包。 但是这到底意味着什么呢? 发生两种可能性之一,我不知道哪一个, 1)连接正在closures,但数据正在写入套接字,从而创build上述exception。 0#0只是意味着什么都没有发送,因为套接字已经closures。 2)连接仍然打开,一个零字节的数据包正在发送(即代码有一个错误),0#0意味着一个零字节的数据包正试图发送。 […]

Python:绑定套接字:“地址已经在使用”

我有一个关于TCP / IPnetworking上的客户端套接字的问题。 假设我使用 try: comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) except socket.error, msg: sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(1) try: comSocket.bind(('', 5555)) comSocket.connect() except socket.error, msg: sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(2) 创build的套接字将绑定到端口5555.问题是,在结束连接后 comSocket.shutdown(1) comSocket.close() 使用wireshark,我看到双方的FIN,ACK和ACKclosures的套接字,我不能再次使用该端口。 我得到以下错误: [ERROR] Address already in use 我想知道怎样才能立即清除端口,以便下次我仍然可以使用同一个端口。 comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) setsockopt似乎不能解决问题谢谢!

用C / C ++(GCC / G ++)在Linux下的套接字编程中发送和接收文件

我想实现在Linux上运行的客户端 – 服务器体系结构,使用能够发送和接收文件的套接字和C / C ++语言。 有没有任何图书馆使这个任务容易? 任何人都可以提供一个例子吗?

socket API的accept()函数是如何工作的?

套接字API是TCP / IP和UDP / IP通信的实际标准(也就是我们所知道的networking代码)。 然而,其核心function之一accept()有点神奇。 借用一个半正式的定义: accept()在服务器端使用。 它接受从远程客户端接收到的尝试创build新的TCP连接,并创build一个与此连接的套接字地址对关联的新套接字。 换句话说, accept返回一个新的套接字,服务器可以通过它与新连接的客户端进行通信。 旧套接字(在其上调用accept )保持打开,在同一端口上,侦听新的连接。 accept工作如何? 它是如何实现的? 这个话题有很多困惑。 许多人声称接受打开一个新的港口,你通过它与客户沟通。 但这显然是不正确的,因为没有新的港口开放。 你实际上可以通过同一个端口与不同的客户进行通信,但是怎么样? 当几个线程在同一个端口上调用recv时,数据如何知道去哪里? 我想这是沿着与套接字描述符相关联的客户端地址的行,并且每当数据通过recv来传递它的路由到正确的套接字,但我不知道。 对这个机制的内部工作进行彻底的解释会很棒。

为什么我的客户套接字没有收到我的服务器套接字发送的内容

使用阻塞,stream.NET套接字我连接到服务器。 每当我读取less量的数据,一切顺利,数据被接收到我的缓冲区中: using (var socket = new Socket(SocketType.Stream, ProtocolType.IP)) { socket.Connect(IPAddress.Parse("127.0.0.1"), 5000); byte[] buffer = new byte[BufferSize]; socket.Receive(buffer); // Here buffer doesn't always contain all data the server sent me? Console.WriteLine(Encoding.Default.GetString(buffer)); } 但在某些情况下,我并没有收到服务器发给我的所有信息。 数据似乎被砍掉了。 这可能是什么原因?

为什么在不尝试I / O的情况下,不可能检测到TCP套接字已被对方正常closures?

作为最近一个问题的后续,我想知道为什么在Java中不可能读取/写入TCP套接字来检测套接字是否被对方正常closures? 无论是使用pre-NIO Socket还是使用NIO SocketChannel似乎都是如此。 当对端正常closuresTCP连接时,连接两端的TCP协议栈都知道这个事实。 服务器端(启动closures的那个)以FIN_WAIT2状态结束,而客户端(没有明确响应closures的那一端)以状态CLOSE_WAIT结束。 为什么在Socket或SocketChannel没有可以查询TCP堆栈的方法来查看底层的TCP连接是否已经终止? TCP堆栈是不是提供这样的状态信息? 还是这是一个devise决定,以避免昂贵的内核调用? 在已经发布了这个问题的一些答案的用户的帮助下,我想我会看到问题可能来自哪里。 未明确closures连接的一端以TCP状态CLOSE_WAIT结束,意味着连接处于closures状态,并等待该端发出自己的CLOSE操作。 我想这是公平的isConnected返回true和isClosed返回false ,但为什么不是有像isClosing ? 以下是使用pre-NIO套接字的testing类。 但是使用NIO获得相同的结果。 import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) throws Exception { final ServerSocket ss = new ServerSocket(12345); final Socket cs = ss.accept(); System.out.println("Accepted connection"); Thread.sleep(5000); cs.close(); System.out.println("Closed connection"); ss.close(); Thread.sleep(100000); } } import java.net.Socket; […]

有多个进程共享侦听套接字的方法吗?

在套接字编程中,您将创build一个监听套接字,然后为每个连接的客户端获得一个普通的stream套接字,您可以使用它来处理客户端的请求。 OS在幕后pipe理传入连接的队列。 两个进程无法同时绑定到相同的端口 – 默认情况下,无论如何。 我想知道是否有一种方法(在任何知名的操作系统,尤其是Windows上)启动一个进程的多个实例,以便它们都绑定到套接字上,因此它们有效地共享队列。 每个stream程实例可以是单线程的; 它只会在接受新的连接时被阻塞。 当一个客户端连接时,其中一个空闲进程实例将接受该客户端。 这将允许每个进程都有一个非常简单的单线程实现,除非通过显式的共享内存,否则就不会共享,用户可以通过启动更多的实例来调整处理带宽。 这样的function是否存在? 编辑:对于那些问“为什么不使用线程?” 显然线程是一个选项。 但是在一个进程中有多个线程,所有对象都是可共享的,而且必须非常小心,以确保对象不是共享的,或者一次只能看到一个线程,或者是绝对不变的,最stream行的语言和运行时缺乏pipe理这种复杂性的内置支持。 通过启动一些相同的工作进程,您将得到一个默认不共享的并发系统,使构build正确和可扩展的实现变得容易得多。

Java通过套接字发送和接收文件(byte )

我试图开发一个非常简单的客户端/服务器,客户端将文件转换为字节,将其发送到服务器,然后将字节转换回文件。 目前该程序只是创build一个空文件。 我不是一个了不起的Java开发人员,所以任何帮助非常感激。 这是接收客户端发送的服务器部分。 ServerSocket serverSocket = null; serverSocket = new ServerSocket(4444); Socket socket = null; socket = serverSocket.accept(); DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); byte[] bytes = new byte[1024]; in.read(bytes); System.out.println(bytes); FileOutputStream fos = new FileOutputStream("C:\\test2.xml"); fos.write(bytes); 这里是客户端部分 Socket socket = null; DataOutputStream out = null; DataInputStream in […]

多less个套接字可能?

有没有人知道现代标准根服务器上有多less个tcp-socket连接是可能的? (每个连接通常都有较less的stream量,但是所有连接必须始终保持运行状态。) 编辑:我们将使用Linux服务器。