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

我是一名Java初学者,我的任务是构建P2p文件共享Java应用程序。 我从创建服务器和客户端开始。客户端可以向服务器发送消息,服务器会做出响应。我认为下一步应该是将线程插入到服务器类中。我读了所有关于它的书,试了试,巴德,我就是做不到。我希望有人能帮助我。 以下是服务器类:

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还是要使用现有的框架?无论哪种方式,我都想联系(电子邮件在个人资料中)。