gpt4 book ai didi

java - 如何将线程添加到我的服务器?

转载 作者:行者123 更新时间:2023-12-03 11:52:38 26 4
gpt4 key购买 nike

我是 Java 初学者,我的任务是构建 P2p 文件共享 Java 应用程序。
我从创建服务器和客户端开始。客户端可以向服务器发送消息,服务器响应。我相信下一步应该是将 Thread 插入到服务器类中。我阅读了所有关于它的内容并尝试了它,但我无法将其拉下来。我希望有一个人可以帮助我。
这是服务器类:

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() ( http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29 ) 用于池化。

编辑:浏览代码,我看到的一个问题是您的输出可能在线程之间交错。不确定您是否关心这一点 - 我无法阅读输出使用的任何语言。

关于java - 如何将线程添加到我的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com