2

我是 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);
    }
  }
 }
}
4

2 回答 2

2

你看过 Java 套接字教程吗?他们在其中一个页面上提供了一个多线程服务器的示例。尝试模仿他们在代码中所做的事情(您将需要创建另一个类)。您可以在本页底部找到示例代码:http: //java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

查找标题“支持多个客户端”

于 2009-12-25T01:52:01.067 回答
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 ) 用于池化。

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

于 2009-12-25T01:50:23.650 回答