Java 如何将线程添加到服务器?
我是一名Java初学者,我的任务是构建P2p文件共享Java应用程序。 我从创建服务器和客户端开始。客户端可以向服务器发送消息,服务器会做出响应。我认为下一步应该是将线程插入到服务器类中。我读了所有关于它的书,试了试,巴德,我就是做不到。我希望有人能帮助我。 以下是服务器类:Java 如何将线程添加到服务器?,java,sockets,multithreading,clients,Java,Sockets,Multithreading,Clients,我是一名Java初学者,我的任务是构建P2p文件共享Java应用程序。 我从创建服务器和客户端开始。客户端可以向服务器发送消息,服务器会做出响应。我认为下一步应该是将线程插入到服务器类中。我读了所有关于它的书,试了试,巴德,我就是做不到。我希望有人能帮助我。 以下是服务器类: import java.net.*; import java.io.*; import java.util.*; public class Server { private static ServerSocket
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
private static ServerSocket serverskiSoket;
private final static int PORT = 3334;
public static void main(String[] args) {
System.out.println("Server se povezuje na port: "+PORT);
try {
serverskiSoket = new ServerSocket(PORT);
System.out.println("Server aktivan: " + serverskiSoket);
System.out.println("Ceka se klijent ...");
} catch (IOException ex) {
String dodatnaPoruka = ex.getMessage().toString();
if (dodatnaPoruka.equals("Address already in use: JVM_Bind"))
System.out.println("Nemoguce je povezati se na port "+ PORT +" jer je zauzet od strane drugog servera.");
System.exit(1);
}
do {
handleClient();
} while(true);
}
private static void handleClient() {
Socket link = null;
try {
link = serverskiSoket.accept();
System.out.println("Klijent povezan: " + link);
Scanner ulazniTok = new Scanner(link.getInputStream());
PrintWriter izlazniTok = new PrintWriter(link.getOutputStream(), true);
int brojPoruka = 0;
String poruka = ulazniTok.nextLine();
while(!poruka.equals("zatvori")) {
System.out.println("Klijent kaze: " + poruka);
brojPoruka++;
izlazniTok.println("Poruka: " + brojPoruka + ": " + poruka);
poruka = ulazniTok.nextLine();
}
izlazniTok.println(brojPoruka + " poruka poslato.");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
System.out.println("Konekcija se zatvara...");
link.close();
} catch(IOException ioEx) {
System.out.println("Diskonekcija nije moguca! \nRazlog: " + ioEx.getMessage());
System.exit(1);
}
}
}
}
下面是客户端类:
import java.net.*;
import java.io.*;
import java.util.*;
public class Klijent {
private static InetAddress host;
private static final int PORT = 3334;
public static void main(String[] args) {
System.out.println("Povezivanje klijenta u toku. Molim sacekajte...");
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException ex) {
System.out.println("ID hosta nije pronadjen");
System.exit(1);
}
pristupiServeru();
}
private static void pristupiServeru() {
Socket link = null;
try {
link = new Socket(host, PORT);
String IPAdresa = StringCutter.RaseciString(host.toString());
System.out.println("Povezan na host cija je IP adresa: "+IPAdresa+", a port: "+PORT);
Scanner ulazniTok = new Scanner(link.getInputStream());
PrintWriter izlazniTok = new PrintWriter(link.getOutputStream(), true);
Scanner unosKorisnika = new Scanner(System.in);
String poruka, odgovor;
do {
System.out.println("Unesite poruku: ");
poruka = unosKorisnika.nextLine();
izlazniTok.println(poruka);
odgovor = ulazniTok.nextLine();
if (!odgovor.contains("primljeno"))
System.out.println("Rekli ste serveru: " + odgovor);
else System.out.println(odgovor);
} while (!poruka.equals("zatvori"));
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
System.out.println("\n*Zatvara se konekcija sa serverom...*");
link.close();
} catch (IOException ex){
System.out.println("Diskonekcija je nemoguca");
System.exit(1);
}
}
}
}
这里有一个非常简单的方法——我没有通读所有的代码,所以请测试它以确保它不会破坏任何东西
private static void handleClient() {
new Thread() {
public void run() {
Socket link = null;
...
} catch(IOException ioEx) {
System.out.println("Diskonekcija nije moguca! \nRazlog: " + ioEx.getMessage());
System.exit(1);
}
} // end outer try
}.start() // end thread
}
基本上,每次都在一个新线程中执行处理程序。看起来处理程序不需要将数据返回到主循环,这样就可以了
除此之外,您可能有太多的线程,因此实际上您应该查看Executors.newFixedThreadPool()
()以了解池
编辑:浏览一下代码,我看到的一个问题是,您的输出可能在线程之间交错。不确定您是否关心这一点-我无法阅读输出所用的任何语言。您看过Java套接字教程吗?他们在其中一个页面上给出了一个多线程服务器的示例。尝试模仿他们在代码中所做的事情(您需要创建另一个类)。 您可以在本页底部找到示例代码:
查找标题“支持多个客户机”谢谢danben,我将您的代码植入了服务器,它工作正常。还有一个例外,我必须处理,但除此之外,它是伟大的。对不起,我没有把塞尔维亚语翻译成英语,我刚才意识到我犯了那个错误@Roman Stolper是的我看过那页。它是众多作品中的一部,所以我认为它并不重要,也不实用。既然你告诉我了,我一定会去把它通读一遍。再次谢谢你,不客气。很高兴它成功了-如果你能将我的答案标记为已接受,那就太好了。另外,因为你是新来的-一般来说,如果你想回复我,你会在我的答案上留下评论。没什么大不了的,我找到了,修好了。再次感谢:)是的,我是新来的,我希望我能很好地四处走动。出于好奇,你是从零开始使用P2P还是要使用现有的框架?无论哪种方式,我都想联系(电子邮件在个人资料中)。