第9将 网络编程-简单的TCP服务器程序

来源:互联网 发布:火线福利轻松领软件 编辑:程序博客网 时间:2024/06/04 23:36

简单的TCP服务器程序
·TCP服务器程序必须先启动运行,TCP客户程序才能连接上TCP服务器。

import java.net.*;
import java.io.*;
public class TcpServer {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) throws Exception {
  // TODO: Add your code here
  ServerSocket ss = new ServerSocket(8001);
  Socket s =ss.accept();
  InputStream in = s.getInputStream();
  BufferedReader br = new BufferedReader(new InputStreamReader(in));
  OutputStream out = s.getOutputStream();
  String strInfo = "welcome to www.it315.org!";
  out.write(strInfo.getBytes());
  //byte [] buf = new byte[1024];
  //int len = in.read(buf);
  String result = br.readLine();
  //System.out.println(new String(buf,0,len));
  System.out.println (result);
  //in.close();
  br.close();
  out.close();
  s.close();
  ss.close();
  
 } 
}

·使用Windows提供的telnet程序测试TCP服务器程序。
在dos中输入:telnet 192.168.1.100 8001,就可以连接到我们本地计算机的8001端口,接收服务器程序发出的欢迎信息“welcome to www.it315.org!”
·使用BufferedReader包装类,从网络输入流中读取一行文本。
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String result = br.readLine();
·如何打开telnet程序的本地回显功能。
在dos中输入:telnet 进入telnet的设置界面,然后输入:set localecho 设置telnet的本地回写功能。

完善的TCP服务器程序模型
编程实例:
    服务器程序能够同时与多个客户端回话,客户端每次向服务器发送一行字符文本,
服务器就将这行字符文本中的所有字符反向排列后回送给客户端,当客户端向服务器
发送的一行字符文本内容为“quit”时,服务器结束与客户端的会话。这里的客户端
是借用Windows的telnet程序完成的。
import java.net.*;
public class ReverseServer {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) {
  // TODO: Add your code here
  try{
   ServerSocket ss =new ServerSocket(8001);
   boolean isOpen = true;
   while(isOpen){
    
    Socket s = ss.accept();
    new Thread(new Service(s)).start();
   }
   ss.close();
  }
  catch(Exception e){
   e.printStackTrace();
  }
  
 } 
}
import java.net.*;
import java.io.*;
public class Service implements Runnable {
 private Socket s = null;
 
 public Service(Socket s) {
  this.s = s;
 } 
 /**
  * Method run
  *
  *
  */
 public void run() {
  // TODO: Add your code here
  try{
   InputStream in = s.getInputStream();
   OutputStream out = s.getOutputStream();
   BufferedReader br = new BufferedReader(new InputStreamReader(in));
   PrintWriter pw = new PrintWriter(out,true);
   boolean isOpen = true;
   while(isOpen){
    
    String strLine = br.readLine();
    System.out.println (strLine);
    if(strLine.equalsIgnoreCase("quit"))
    {
     return;
    }
    String strEcho = new StringBuffer(strLine).reverse().toString();
    pw.println(strLine+"--->"+strEcho);
   }
   br.close();
   pw.close();
   s.close();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}
注意:以上程序基本实现了完善的TCP服务器程序的框架了,有个奇怪的现象是当我们在telnet中输入字符错了退格再输,
telnet会将这些像退格键的特殊字符都传给服务器程序处理。奇怪的现象就是程序接收了这些特殊的字符导致的。

TCP服务器程序模型的编写要点:
 -TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSocket.accept方法。
 -服务器程序与每个客户端连接的会话过程不能互相影响,需要在独立的线程中运行。
 -一个线程服务器对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话。

如何检测和解决端口冲突问题
·使用netstat命令查看当前正在使用的TCP端口号。--netstat -na
·通过一个配置参数来指定TCP服务程序所使用端口号。
ServerSocket ss =new ServerSocket(8001);将“8001”写成一个外部参数的形式传给程序
·将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取那个端口号。

原创粉丝点击