posts - 51, comments - 17, trackbacks - 0, articles - 9
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java TCP

Posted on 2007-04-20 22:54 chenweicai 阅读(365) 评论(0)  编辑  收藏
public class ServerSocket
extends Object

此类实现服务器套接字服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。



public class Socket
extends Object

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器之间的通信端点

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。


/**
 * 为了验证我们的服务器程序能否正常工作,还必须有一个客户端程序与之通信。
 * 我们也没必要每次都要编写客户端程序来测试。其实, Windows提供的telnet
 * 程序,就是一个TCP客户端程序,我们只要使用telnet程序对我们的服务器程序
 * 进行测试,我们只要在运行telnet程序时指定所要连接的服务器程序的IP地址
 * 和端口号,telnet程序就会按照指定的参数去与服务器程序进行连接。建立连接
 * 后,在telnet程序窗口中键入的内容会发送到服务器,从服务器端接收到的数据
 * 会显示在窗口中。
 * 先运行TcpServer程序,然后在命令行中输入 telnet 10.214.16.80 8001
 * 就会执行
 */

// TCP 服务端程序
public class TcpServer {

 public static void main(String[] args){
  
  try{
   //建立一个在8001端口上等待连接的ServerSocket对象
   ServerSocket ss = new ServerSocket(8001);
   
   //侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞,返回客户端套接字
   Socket s = ss.accept();
   
   InputStream ips = s.getInputStream();//返回此套接字的输入流
   OutputStream ops = s.getOutputStream();//返回此套接字的输出流
   
   //将字节从指定的字节数组写入此输出流
   ops.write("chenweicai...".getBytes());
   
//   byte[] buf = new byte[1024];
//   // 从输入流中读取一定数量的字节并将其存储在缓冲区数组buf中
//   int len = ips.read(buf);
//   System.out.println(new String(buf, 0, len));
   
   //由于telent只要输入就发送,而不管有没有回车,所以只有第一个字符被发送。
   //java提供了一个BufferedReader类,可以帮助我们按行处理输入流。
   BufferedReader br = new BufferedReader (new InputStreamReader(ips));
   System.out.println("The message comes form client: " + br.readLine());//输出客户端输入的内容
   
   br.close();//关闭包装类,会自动关闭包装类中所包装的底层类,所以不用调用ips.close().
//   ips.close();
   ops.close();
   s.close();
   ss.close();
  }catch (Exception e){
   e.printStackTrace();
  }
 }
}

给个具体的例子

/**
 * 实现服务器和客户端之间的对话功能
 */
public class Servicer implements Runnable {

 Socket s;
 
 public Servicer (Socket s){
  this.s = s;
 }
 
 public void run(){
  
  try {
   InputStream ips = s.getInputStream();
   OutputStream ops = s.getOutputStream();
   BufferedReader br = new BufferedReader(new InputStreamReader(ips));
   DataOutputStream dos = new DataOutputStream(ops);
   
   while(true){
    String strWord = br.readLine();
    System.out.println("From Client StrWord: " + strWord + strWord.length());
    if(strWord.equalsIgnoreCase("quit"))
     break;
    
    String strEcho = (new StringBuffer(strWord).reverse()).toString();
    dos.writeBytes(strWord + "---->" + strEcho + System.getProperty("line.separator"));
   }
   br.close();
   dos.close();
   s.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
}


import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {

 public static void main(String[] args){
  
  try{
   ServerSocket ss = new ServerSocket(8001);
   
   while(true){
    Socket s = ss.accept();
    new Thread(new Servicer(s)).start();
   }
  }catch(Exception e){
   
  }
 }
}



public class TcpClient {

 public static void main(String[] args){
  
  try{
   if(args.length < 2){
    System.out.println("Usage: java TcpClient ServerIP ServerPort");
    return;
   }
   
   Socket s = new Socket(InetAddress.getByName(args[0]), Integer.parseInt(args[1]));
   InputStream ips = s.getInputStream();
   OutputStream ops = s.getOutputStream();
   
   BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
   DataOutputStream dos = new DataOutputStream(ops);
   BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
   
   while(true){
    String strWord = brKey.readLine();
    dos.writeBytes(strWord + System.getProperty("ling.separator"));
    if(strWord.equalsIgnoreCase("quit"))
     break;
    else
     System.out.println(brNet.readLine());
   }
   dos.close();
   brNet.close();
   brKey.close();
   s.close();
  }catch (Exception e){
   
  }
 }
}


只有注册用户登录后才能发表评论。


网站导航: