当前位置:  技术问答>java相关

Java 网络编程---SL275练习题疑惑

    来源: 互联网  发布时间:2015-08-04

    本文导语:  SL275---Module16练习题1 用Socket编写网络聊天程序,以下是源代码,为求完整,分几部分贴出,各位大虾 不要嫌长,我的问题是: ChatServer如何接受Client谈话内容并转发给所有其他聊天的Client.尤其是ChatServer中Connection类的...

SL275---Module16练习题1
用Socket编写网络聊天程序,以下是源代码,为求完整,分几部分贴出,各位大虾
不要嫌长,我的问题是:
ChatServer如何接受Client谈话内容并转发给所有其他聊天的Client.尤其是ChatServer中Connection类的run(),没有循环监听,怎么能实现?
疑问部分代码有/**************************/标明,请各位大虾解释,不甚感激!

//ChatServer代码
import java.io.*;
import java.net.*;
import java.util.*;
import java.applet.*;

public class ChatServer implements Runnable {

  public final static int DEFAULT_PORT = 2000;
  public final static int DEFAULT_MAX_BACKLOG = 5;
  public final static int DEFAULT_MAX_CONNECTIONS = 20;
  public final static String DEFAULT_HOST_FILE = "hosts.txt";
  public final static String DEFAULT_SOUND_FILE = "file:gong.au";
  public final static String MAGIC = "Yippy Skippy";

  private String magic = MAGIC;

  private int port = DEFAULT_PORT;
  private int backlog = DEFAULT_MAX_BACKLOG;
  private int numConnections = 0;
  private int maxConnections = DEFAULT_MAX_CONNECTIONS;
  private String hostfile = DEFAULT_HOST_FILE;
  private String soundfile = DEFAULT_SOUND_FILE;
  private Vector connections = null;
  private AudioClip connectSound = null;
  private Hashtable hostInfo = new Hashtable(15);

  public static void main(String[] args) {
    ChatServer cs = new ChatServer();
    cs.go();
  }

  public void go()
   {
    String portString = System.getProperty("port");
    if(portString != null) port = Integer.parseInt(portString);

    String backlogString = System.getProperty("backlog");
    if(backlogString != null) backlog = Integer.parseInt(backlogString);

    String hostFileString = System.getProperty("hostfile");
    if(hostFileString != null) hostfile = hostFileString;

    String soundFileString = System.getProperty("soundfile");
    if(soundFileString != null) soundfile = soundFileString;

    String magicString = System.getProperty("magic");
    if(magicString != null) magic = magicString;

    String connections = System.getProperty("connections");
    if(connections != null) maxConnections = Integer.parseInt(connections);
    this.connections = new Vector(maxConnections);

    System.out.println("Server settings:ntPort="+port+"ntMax Backlog="+
                       backlog+"ntMax Connections="+maxConnections+
     "ntHost File="+hostfile+"ntSound File="+soundfile);

    createHostList();

    try {
      URL sound = new URL(/tech-qa-java/soundfile/index.html);
      connectSound = Applet.newAudioClip(sound);
    } catch(Exception e) { e.printStackTrace(); }

    this.port = port;
    Thread t = new Thread(this);
    t.start();
   }

  private void createHostList() {
    File hostFile = new File(hostfile);
    try {
      System.out.println("Attempting to read hostfile hosts.txt: ");
      FileInputStream fis = new FileInputStream(hostFile);
      InputStreamReader isr = new InputStreamReader(fis);
      BufferedReader br = new BufferedReader(isr);
      String aLine = null;
      while((aLine = br.readLine()) != null)
        {
          int spaceIndex = aLine.indexOf(' ');
          if(spaceIndex == -1) {
            System.out.println("Invalid line in host file: "+aLine);
            continue;
          }
          String host = aLine.substring(0,spaceIndex);
          String student = aLine.substring(spaceIndex+1);
          System.out.println("Read: "+student+"@"+host);
          hostInfo.put(host,student);
        }
      }
     catch(Exception e) { e.printStackTrace(); }
    }          

  public void run()
   {
    ServerSocket serverSocket = null;
    Socket communicationSocket;    

    try
     {
      System.out.println("Attempting to start server...");
      serverSocket = new ServerSocket(port,backlog);
     } 
    catch (IOException e) 
     { 
      System.out.println("Error starting server: Could not open port "+port);
      e.printStackTrace();
      System.exit(-1);
     }
    System.out.println ("Started server on port "+port);

    // Run the listen/accept loop forever
    while (true)
     {
      try 
       {
        // Wait here and listen for a connection
        communicationSocket = serverSocket.accept();
        HandleConnection(communicationSocket);
       } 
      catch (Exception e)
       { 
        System.out.println("Unable to spawn child socket.");
        e.printStackTrace();
       }
     }
   }

  public void HandleConnection(Socket connection)
   {
    synchronized(this)
     {
      while(numConnections == maxConnections)
       {
        try { wait(); } 
        catch(Exception e) { e.printStackTrace(); }
       }
     }
    numConnections++;
    Connection con = new Connection(connection);
    Thread t = new Thread(con);
    t.start();
    connections.addElement(con);
   }

  public synchronized void connectionClosed(Connection connection)
   {
    connections.removeElement(connection);
    numConnections--;
    notify();
   }

  public void sendToAllClients(String message)
   {
    Enumeration cons = connections.elements();
    while(cons.hasMoreElements())
     {
      Connection c = (Connection)cons.nextElement();
      c.sendMessage(message);
     }
   }

  class Connection implements Runnable 
   {

    private Socket communicationSocket = null;
    private OutputStreamWriter out = null;
    private BufferedReader in = null;

    public void run()
     {
      OutputStream socketOutput = null;
      InputStream socketInput = null;

      try
       {
        socketOutput = communicationSocket.getOutputStream();
        out = new OutputStreamWriter(socketOutput);
        socketInput = communicationSocket.getInputStream();
        in = new BufferedReader(new InputStreamReader(socketInput));

        
        InetAddress address = communicationSocket.getInetAddress();
        String hostname = address.getHostName();

        String welcome = 
          "Connection made from host: "+hostname+"nEverybody say hello";
        String student = (String)(hostInfo.get(hostname));
        if(student != null) welcome += " to "+student;
        welcome+="!n";
        ChatServer.this.sendToAllClients(welcome);
        System.out.println("Connection made "+student+"@"+hostname);
        sendMessage("Welcome "+student+" the passphrase is "+magic+"n");
        String input = null;

        while((input = in.readLine()) != null) {
          if(input.indexOf(magic) != -1 && connectSound != null) 
           {
             connectSound.play();
             sendMessage("Congratulations "+student+" you sent the passphrase!n");
             System.out.println(student+" sent the passphrase!");
            }
          else ChatServer.this.sendToAllClients(input+"n");
        }
       }
      catch(Exception e) { }
      finally
       {
        try 
         {
          if(in != null) in.close();
          if(out != null) out.close();
          communicationSocket.close();
         } 
        catch(Exception e) { e.printStackTrace(); }
        ChatServer.this.connectionClosed(this);
       }
     }

    public Connection(Socket s)
     {
      communicationSocket = s;
     }       

    public void sendMessage(String message)
     {
      try
       {
        out.write(message);
        out.flush();
       }
      catch(Exception e) { e.printStackTrace(); }
     }
   }

 }



|
不太懂:
“input = in.readLine()) != null很容易满足,导致该线程结束。”
BufferedReader.readLine()只有在读到流结束符时才返回null,这只有客户端的输出流调用finish()或者close()方法,你才能读到。注意:用户仅仅敲击回车键,那in.readLine()读取的是回车苻,不是流结束符。

|
heifei()说得对呀,只有流被关闭是readLine才返回null。

    
 
 

您可能感兴趣的文章:

  • <<java编程思想>>的一道练习题???写一个程序,打印出从命令行获取的三个自变量?解决即结帖
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 用java做网络编程和用c做网络编程有啥区别
  • 电力翻译的o'reilly的Java网络编程(Java network programming)怎样?
  • Java 网络编程有些什么内容?
  • java的网络编程
  • 怎样学习JAVA网络编程?
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢 iis7站长之家
  • 学习JAVA网络编程需要那些硬件设备?
  • JAVA网络编程(socket),用什么工具开发?怎么配置环境?
  • 怎么样利用Socket进行Java网络编程
  • 初学java网络编程的问题
  • 谁能介绍几个关于java网络编程的网站
  • 求O'Reilly《Java网络编程》中文版
  • 哪里有java网络编程(第二版)的电子书下载呀
  • 请问各位几个关于java网络编程的简单问题,谢谢!
  • java网络编程的基本问题,求救(在线等待)
  • java网络编程之识别示例 获取主机网络接口列表
  • 在java网络编程中,传递数据时,如何把二维数组从客户端传递到服务器端?请教大家,谢了
  • java网络编程高手请进!高分求教!问题解决一定给分!!!
  • 请问有谁有关于JAVA无线网络编程的资料,能不能给我发一份,或者介绍相关免费网战也可以
  • 用JAVA过行无线网络编程,我现在只知道要用到J2ME,可其它就都不知道了,可不可以介绍一下
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java初学者疑惑,请各位高手指点!
  • 在File.java中list()方法的疑惑
  • Java 的疑惑
  • java初学者的几个疑惑,请帮帮我,谢谢
  • 有关Java认证的一些疑惑。。。。。。>>>>>>>>>>>>>
  • 问一个有关c++和java的区别的问题,疑惑
  • <<Thingking in JAVA>>里的疑惑 :Vector 与 ArrayList
  • 一个爱好java,又准备考研的“愤青”的疑惑。。。。。。。
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3