我制作了Client.java
和Server.java
。他们在这里。
Client
public class Client
{
ClientConnection cc;
public static void main(String[] args)
{
new Client();
}
public Client()
{
try
{
Socket s = new Socket("localhost",4444);
cc = new ClientConnection(s,this);
cc.start();
listenForInput();
} catch (UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
public void listenForInput(){
Scanner console = new Scanner(System.in);
while(true){
while(!console.hasNextLine()){
try
{
Thread.sleep(10);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
String input = console.nextLine();
cc.sendStringToServer(input);
}
}
}
Server
public class Server
{
ServerSocket ss;
ArrayList<ServerConnection> connections = new ArrayList<ServerConnection>();
boolean shouldRun = true;
ServerWindow serverWindow;
public static void main(String[] args)
{
new Server();
}
public Server(){
try
{
serverWindow= new ServerWindow();
serverWindow.setVisible(true);
ss = new ServerSocket(4444);
serverWindow.serverLog("Server starting");
while(shouldRun){
Socket s = ss.accept();
ServerConnection sc = new ServerConnection(s,this);
sc.start();
connections.add(sc);
serverWindow.serverLog("A client connected from " + sc.getIP());
}
} catch (IOException e)
{
e.printStackTrace();
}
}
public ServerWindow getServerWindow(){
return serverWindow;
}
}
当我运行Client.java
和Server.java
时,他们会很好地连接并按预期执行他们的任务。但是当我在一个新类中并且我创建一个客户端对象和一个服务器对象时,客户端无法正常工作。
public class tester
{
public static void main(String[] args)
{
Server server = new Server();
Client client = new Client();
client.cc.sendStringToServer("From tester");
}
}
server
工作正常,它按预期创建窗口,但client
对象不起作用。我的server
对象无法像正常工作时那样识别连接,而client
的消息将无法通过。我错过了什么?是否与使用localhost
作为ip?
答案 0 :(得分:0)
您的问题是您通过调用
来阻止主线程listenForInput();
在您的客户端中。创建一个调用输入监听器的新线程,你会没事的。
new Thread(new Runnable() {
public void run() {
listenForInput();
}
}).start();
编辑:同样的问题出现在Server类中。有一个无限循环,阻止Server构造函数完成。另外添加:
new Thread(new Runnable() {
public void run() {
while(shouldRun) {
Socket s = ss.accept();
// do other stuff
}
}
}).start();
注意:等待输入时不需要休眠线程。只需写一些空括号或分号。
while (!console.hasNextLine()) ;