- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个简单的聊天程序,我找到了各种示例,但我还是尝试从头开始完成它。
我有服务器类(扩展线程)和一个 GUI 类,当单击“连接”或“断开连接”按钮时,GUI 停止(卡住)
服务器代码:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* @author Shahar Galukman
*/
public class ChatServer extends Thread{
ServerSocket ss;
boolean serverStopped = false;
private int port = 18524;
public ChatServer(){
serverStart();
}
private void serverStart(){
//Create new server socket
try {
ss = new ServerSocket(port);
} catch (Exception e) {
System.out.println("An error eccurd connection server: " + e.getMessage());
}
//wait for clients to connect
while(!serverStopped){
try {
Socket clientSocket = ss.accept();
/*
* Code will halt here until a client socket will be accepted.
* Below a new client thread will be created
* enabling multi client handling by the server
*/
//create new ChatClientThread here
} catch (IOException ex) {
System.out.println("Error accpeting client socket");
}
}
}
//Stop the server
public void stopServer(){
serverStopped = true;
ss = null;
}
}
我有一个带有连接和断开按钮的简单 SWING GUI,我正在使用一个名为 Handler 的内部类来向按钮添加 Action 监听器。
Handler类(位于GUI类末尾:
//inner class
class Handler implements ActionListener
{
//This is triggered whenever the user clicks the login button
@Override
public void actionPerformed(ActionEvent ae)
{
ChatServer server = new ChatServer();
//checks if the button clicked
if(ae.getSource()== connectButton)
{
try{
server.start();
serverStatusField.setText("Connected");
}catch(Exception e){
e.printStackTrace();
}
}else if(ae.getSource()== disconnectButton){
server.stopServer();
serverStatusField.setText("Disconnected");
}
}
}
同样在 GUI 类中,我将 Action 监听器添加到 bottun,如下所示:
public GUI() {
initComponents();
//create new handler instance
handle = new Handler();
connectButton.addActionListener(handle);
disconnectButton.addActionListener(handle);
}
据我所知,当我点击连接按钮时,一个新的服务器线程正在启动。那么,为什么 GUI 会卡住?我应该在这里使用多线程吗?
最佳答案
在您的serverStart
方法中,您有一种等待服务器停止的无限循环。当调用此按钮时,调用者线程肯定会永远循环并阻止其他调用。
在 Swing 中,GUI 由主线程处理。因此,如果您从主线程调用 serverStart
,gui 将阻塞直到循环中断,而这永远不会发生。
因此,是的,您应该使用多线程并在另一个独立线程上调用 serverStart
。
通常,您应该采用以下解决方案:
编辑:
这是一个关于线程的很好的 oracle 教程:
http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html
第二次编辑:
您的代码也有问题。为什么 serverStart
方法是在 ChatServer
的构造函数中调用的,而不是在从 Thread 覆盖的 run
方法中调用的?在那种情况下,在构造 ChatServer 线程时,在主线程上调用无限循环。我认为你应该在 Thread 的 run 方法中调用 serverStart
:
例如:
public class ChatServer extends Thread{
....
public ChatServer(){
}
@Override
public void run {
serverStart();
}
关于java - 使用 ServerSocket 启动服务器时 GUI 暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16263351/
在服务器端,我使用这段代码: ServerSocket server = new ServerSocket(1234); Socket server_socket = server.accept();
假设A是服务器,B是客户端。 B 创建一个到服务器 A 的套接字 b 并 ServerSocket.accept() 创建一个相应的套接字 a 对于客户端 B 现在,如果服务器 A 关闭了 a 但客户
我想在单独的线程中运行Python serversocket 类。为此,我修改了此代码以支持 python 线程: 原始文件 import SocketServer class MyTCPHandle
我正在使用一些 java 创建一个小客户端来监控网络。对于网络上的每个节点,我运行一个客户端,但也运行一个 ServerSocket 来监听传入的连接。我写的代码似乎卡在了 ServerSocket.
虽然 ServerSocket 类被设计为一般监听传入连接,但我可以只使用 Socket 对象来代替并在 java 中检索传入数据吗?如果是,那么我是否需要采取任何额外的预防措施? 编辑:感谢您的回答
我在Java项目的类之一中有一个ServerSocket。该套接字接收一些导致新操作的命令。例如: deleteAllFromDB ->删除数据库上的所有条目。 sendMsgToX ->创建发送到X
我用java写了一个服务器,这里是代码: public mainClass() { try { ss = new ServerSocket(8080);
我目前正在参与学校的一个项目,我们正在构建一个在 Android 手机上使用的通信系统。为此,我们将使用一个向所有客户端打开套接字的服务器,使它们进行通信。 我以前做过几个聊天应用程序,没有任何套接字
我有这两个类 Client.java 和 Server.java,每个类都包含一个 main 方法。想法非常简单,其中的代码也非常相似。我试图实现的目标是打开一个使用 ServerSocket 监听特
这可能是一个愚蠢的问题,但就是这样。我正在编写这个聊天程序,其中有一个服务器和可以连接到它的客户端。我想在程序中实现私有(private)消息传递,但我不知道如何让客户端直接相互连接。对于服务器,我使
ServerSocket 与多个客户端一起使用,我们可能为每个客户端附加单独的线程来工作,但问题是连接工作正常并接受所有客户端,但仅服务最后一个连接。所以这不是问题,或者这是正常现象。 服务器代码:
我是套接字编程的新手,我只是尝试一些东西。我想做的是让客户端读取文本文件,将该文件中的行保存在 ArrayList 中,然后将这些行发送到服务器。这是我的代码。连接成功建立,但是当服务器尝试从他的Bu
我有以下代码片段: if (servsock == null) { System.out.println("HELLO1!"); servsock = new ServerSocket
我正在查看serversocket API,它说允许的最大连接数是50。我尝试测试它.. public class ClientSocketTest { public static void
我试图制作一个小聊天程序,但它真的不想工作。我的服务器和客户端基本相同:它们创建一个新的套接字和一个新的聊天(GUI)。有人可以帮我找出我犯的错误吗? 服务器代码: import java.io.In
我尝试使用蓝牙将图像从一个设备发送到其他设备。为此,我采用 Android 蓝牙聊天应用程序源代码,当我发送字符串时它工作正常。但是如果我将图像作为字节数组发送,则 while 循环不会中断或从输入流
我目前正在为我的大学开发一款 TicTacToe 多线程网络游戏,但遇到了一个恼人的问题。 我希望我的服务器每次接受 2 个连接,然后等待其他 2 个连接等。 问题是,在我的代码中,如果客户端连接到服
我正在构建一个简单的服务器应用程序,我可以在本地网络中连接到它。但我无法通过互联网连接。 这是我的服务器代码: ServerSocket server; try { server = new
我有以下构造: try { serverSocket = new ServerSocket(port); } catch (Exception e) { throw new Runti
我一直在尝试在我创建的应用程序中开发一个嵌入式网络服务器。本质上,我们有创建一个简单网络服务器(使用 ServerSocket)的主进程,然后主进程(理论上)将处理它的业务。 Main(){
我是一名优秀的程序员,十分优秀!