java - new Socket 挂起应用程序
问题描述
当我JFrame
尝试创建一个新的Socket
. 相同的代码(不是相同的 .java 文件,而是相同的代码行)在我旁边的计算机上工作。
知道为什么代码会冻结吗?
尝试#1
private Socket socket;
public void connect( String ip, int port ) {
try {
System.out.println( ip + " " + port ); //just to show the arguments doesn't seem to be the issue.
socket = new Socket(ip,port);
System.out.println(".");
} catch (IOException e) {System.out.println(e);}
}
控制台中的输出(xxx = digets)。如你看到的, ”。” 从不打印。
192. XXX _ xxx .53 1494
这也不起作用(帧“冻结”和相同的输出)。
尝试#2
public void connect( String ip, int port ) {
try {
System.out.println( ip + " " + port );
socket.connect(new InetSocketAddress(ip,port), 5000);
System.out.println(".");
} catch (IOException e) {System.out.println(e);}
}
192. XXX _ xxx .53 1494
解决方案
您正在 Swing 事件调度线程中运行该代码。这是执行诸如处理侦听器中的事件之类的事情并执行绘画的线程。
它挂起是因为 Socket 正在尝试连接,并且在此期间,由于线程忙(尝试连接),因此无法进行事件处理或绘制。
套接字连接(和读/写)需要发生在它自己的线程中,以免阻塞 EDT。
推荐阅读
- python - Python:如何保存不同长度的二维 numpy 数组列表
- swift - 努力使用 DispatchGroups 让多个异步调用正常工作
- angular - PrimeNG Treetable 以编程方式扩展所有不工作的节点
- typescript - RUC厄瓜多尔验证者
- numpy - 有没有更好的方法来调整 numpy 数组形式的图像的大小?
- arrays - 为什么我在 c 中分配 2048 * 2048 int 数组时出现分段错误
- c# - Visual Studio 上的鼠标交互
- python-3.x - python 3中pandas数据帧的自定义Scaler函数加倍长度(行)
- .net - BinarySearch 和 RegistryKey 的定义?
- node.js - Sequelize Op.overlap 用于字符串数组