简单的Java线程化的TCP服务器线程
/*main method*/
Server server = new Server(tcpPort);
new Thread(server).start();
try {
Thread.sleep(1000*60); /* 60 seconds*/
} catch (InterruptedException e) {
e.printStackTrace();
}
server.stop;
...
这是我写的代码。服务器线程已启动,并运行60秒。我如何改变这个无限运行,当用户通过BufferedReader或其他东西输入回车时结束。简单的Java线程化的TCP服务器线程
我已经与
while(!input.equals("")) { /* just pseudocoded here...*/
Thread.sleep(10);
}
尝试过,但无法正常工作,这将我的服务器停止。我的客户甚至不会连接到它。我是否犯了设计错误,或者这是一个容易解决的问题?
从此SO线程开始:How to create a basic Java Server?。它会给你一个如何编写一个非常简单的服务器的例子。关键要注意的是serverSocket.accept()
。它会阻止 - 换句话说,它会永远等待客户端连接,或者在出现错误时会失败。一旦连接了一个客户端,你将得到一个clientSocket,你可以使用它来读取客户端写的内容,并写入它。
这对理解Java网络编程来说是一个很好的起点。不过,我建议您阅读有关此主题的更多信息。就像这样:http://beej.us/guide/bgnet/
是的,但我有一个工作的服务器。我的班级服务器工作正常。你们有没有读过,我的问题是什么?我的服务器正在运行,但只有这60秒。 (请参阅Thread.sleep行)但是,我想使它永远运行,并退出服务器,如果我从System.in获得任何输入。 – user1781173
我没看过。也许我应该告诉你,而不是'Thread.sleep(60000)'你写'shouldExit = false; while(shouldExit){doServerStuff(); }'。它将永远循环调用doServerStuff(),直到shouldExit变为true。阅读下面的Kumar示例 - 在无限循环中等待客户端连接,在单独的线程中处理它们。但是,它不会停止服务器,因为你想要的。你应该很容易自己做。 – DejanLekic
-试试这个我写的基本聊天服务器。该服务器只是保持循环运行,并将客户端发送的消息广播到与此服务器关联的所有其他客户端。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
// ///----------------------------------------Instance Variable Fields
ServerSocket ss = null;
Socket incoming = null;
// ///----------------------------------------Instance Variable Fields
// ///---------------------------------------- static Variable Fields
public static ArrayList<Socket> socList = new ArrayList<Socket>();
// ///---------------------------------------- static Variable Fields
public void go() {
try {
ss = new ServerSocket(25005);
while (true) {
incoming = ss.accept();
socList.add(incoming);
System.out.println("Incoming: " + incoming);
new Thread(new ClientHandleKaro(incoming)).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ClientHandleKaro implements Runnable {
InputStream is = null;
OutputStream os = null;
InputStreamReader isr = null;
BufferedReader br = null;
PrintWriter pw = null;
boolean isDone = false;
Socket sInThread = null;
public ClientHandleKaro(Socket sxxx) {
this.sInThread = sxxx;
}
@Override
public void run() {
if (sInThread.isConnected()) {
System.out.println("Welcamu Clienta");
System.out.println(socList);
}
try {
is = sInThread.getInputStream();
System.out.println("IS: " + is);
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
os = sInThread.getOutputStream();
pw = new PrintWriter(os, true);
String s = new String();
while ((!isDone) && (s = br.readLine()) != null) {
String[] asx = s.split("-");
System.out.println("On Console: " + s);
// pw.println(s);
Thread tx = new Thread(new ReplyKaroToClient(s,
this.sInThread));
tx.start();
if (asx[1].trim().equalsIgnoreCase("BYE")) {
System.out.println("I am inside Bye");
isDone = true;
}
}
} catch (IOException e) {
System.out.println("Thanks for Chatting.....");
} finally {
try {
Thread tiku = new Thread(new ByeByeKarDo(sInThread));
tiku.start();
try {
tiku.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Accha to hum Chalte hain !!!");
System.out.println(socList);
br.close();
pw.close();
sInThread.close();
} catch (IOException e) {
}
}
}
}
class ReplyKaroToClient implements Runnable {
public String mString;
public Socket mSocket;
public ReplyKaroToClient(String s, Socket sIn) {
this.mString = s;
this.mSocket = sIn;
}
@Override
public void run() {
for (Socket sRaW : socList) {
if (mSocket.equals(sRaW)) {
System.out.println("Mai same hun");
continue;
} else {
try {
new PrintWriter(sRaW.getOutputStream(), true)
.println(mString);
} catch (IOException e) {
System.out.println("Its in Catch");
}
}
}
}
}
class ByeByeKarDo implements Runnable {
Socket inCom;
public ByeByeKarDo(Socket si) {
this.inCom = si;
}
@Override
public void run() {
try {
new PrintWriter(inCom.getOutputStream(), true)
.println("You have Logged Out of Server... Thanks for ur Visit");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server().go();
}
}
谢谢,但我有一个运行服务器。看到下面的帖子的评论,或更仔细地阅读我的话题。这不是关于服务器本身。 – user1781173
请张贴您的实际代码。 –