您的位置:首页 > 理论基础 > 计算机网络

心得13--网络编程4-TCP协议案例分析

2012-09-12 15:39 288 查看

一:简单案例:
1.   客户端
packagecom.Tcp;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.Socket;
importjava.net.UnknownHostException;
public classClient {
   /**
    *@param args
    *@throws IOException
    * @throwsUnknownHostException
    */
   public static void main(String[] args) throwsException {
        //
建立客户端服务器
      Socket s = newSocket("192.168.49.200",9008);
      //
获取输出流对象
      OutputStream out = s.getOutputStream();
      out.write("我来了!!".getBytes());
      //读取服务器发过来的信息
      InputStream is = s.getInputStream();
      byte[] buf = new byte[1024];
      System.out.println(newString(buf,0,is.read(buf)));
      s.close();
   }
}
2.发送端

packagecom.Tcp;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
public classServer {
   /**
    *@param args
    *@throws Exception
    */
   public static void main(String[] args) throwsException {
      //
建立客户端服务器
      ServerSocket ss = new ServerSocket(9008);
      //调用accept()方法接收客户端发过来的文件
      Socket s = ss.accept();
      //获取输出流对象
      InputStream is = s.getInputStream();
      byte[] buf = new byte[1024];
      String ip =s.getInetAddress().getHostAddress();
      System.out.println(ip+":"+newString(buf,0,is.read(buf)));
      //服务器端向客户返回信息
      OutputStream out = s.getOutputStream();
      out.write("我收到了!!".getBytes());
      s.close();
      ss.close(); //关了s与ss也就关了out、in,因为out、in是从s、ss中获取的
   }
}
二:键盘输入案例:

1.客户端

package com.Tcp;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.net.UnknownHostException;

public class Client1 {

   /**

    * @param 客户端通过键盘录入信息,发送到服务器端;服务器端收到信息后,将信息转为大写返回给客户端。

    * @throws IOException

    * @throws UnknownHostException

    */

   publicstatic void main(String[] args) throws Exception {

       // 建立客户端服务器

      Sockets = new Socket("192.168.49.200",9008);

      //获取输出流对象

      OutputStreamout = s.getOutputStream();

      //封装获取的输入流和输出流

      System.out.println("请您输入:");

      BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));

      BufferedWriterbwOut = new BufferedWriter(new OutputStreamWriter(out));

      BufferedReaderbrIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

      Stringline = null;

      while((line=br.readLine())!=null){

        if(line.equals("over")){

           break;

        }  //设置循环结束条件,也是退出命令的条件

        bwOut.write(line);

        bwOut.newLine();  //
换新行,字符缓冲流内部不知道换行

        bwOut.flush();    //必须刷新,否则用的缓冲流输入输出会不显示

        System.out.println("Server:"+brIn.readLine());

      }

        br.close();

        s.close();  //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流

   }

}

2.  发送端

package com.Tcp;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;

public class Server1 {

   /**

    * @param args

    * @throws IOException

    * @throws UnknownHostException

    */

   publicstatic void main(String[] args) throws Exception {

       // 建立客户端服务器

      ServerSocketss = new ServerSocket(9008);

      Sockets = ss.accept();

   System.out.println(s.getInetAddress().getHostAddress()+"ServerSocket已连接!");

      //获取输出流对象

      InputStreamis = s.getInputStream();

      //封装获取的输入流和输出流

      BufferedReaderbrIn = new BufferedReader(new InputStreamReader(is));

      BufferedWriterbwOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

      Stringline = null;

      while((line=brIn.readLine())!=null){

        if(line.equals("over")){

           break;

        }  // 这个if()语句虽然与前面例子不同放到了while循环的最前面,但是跟放到最后的效果一样,不影响程序的正确性

        bwOut.write("你好Client,您的消息已收到!");

        bwOut.newLine();

        bwOut.flush();

        System.out.println("Client:"+line);

      }

        s.close();

        ss.close();  //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流

   }

}

三、改造版案例(运用PrintWriter类来调用它的println()方法,简化代码,去除刷新和换行操作)
1.Client客户端
packagecom.Tcp;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassClient2 {
   /**
    * @param
客户端通过键盘录入信息,发送到服务器端;服务器端收到信息后,将信息转为大写返回给客户端。
    * @throws IOException
    * @throws UnknownHostException
    */
   public staticvoid main(String[] args)throws Exception {
        //
建立客户端服务器
      Socket s = newSocket("192.168.49.200",9008);
      //
获取输出流对象
      OutputStreamout = s.getOutputStream();
      //封装获取的输入流和输出流
      System.out.println("请您输入:");
      BufferedReaderbr =
new
BufferedReader(new InputStreamReader(System.in));
      PrintWriter pw= new PrintWriter(out,true); //这里用PrintWriter类代替Buffered可以不用缓冲与换行的操作
      BufferedReaderbrIn =
new
BufferedReader(newInputStreamReader(s.getInputStream()));
      String line = null;
      while((line=br.readLine())!=null){
        if(line.equals("over")){
           break;
        }  //设置循环结束条件,也是退出命令的条件
        pw.println(line);   //但是这里不能调用writer()方法,必须调用PrintWriter类的println()方法
        System.out.println("Server:"+brIn.readLine());
      }
        br.close();
        s.close();  //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流
   }
}
Server服务器端:
package com.Tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class Server2 {
   /**
    * @param args
    * @throws IOException
    * @throws UnknownHostException
    */
   public static void main(String[]args) throws Exception {
        //
建立客户端服务器
      ServerSocket ss = newServerSocket(9008);
      Socket s = ss.accept();
   System.out.println(s.getInetAddress().getHostAddress()+"ServerSocket已连接!");
      //
获取输出流对象
      InputStream is =s.getInputStream();
      //封装获取的输入流和输出流
      BufferedReader brIn = newBufferedReader(new InputStreamReader(is));
      PrintWriter pw = newPrintWriter(s.getOutputStream(),true);
      String line = null;
      while((line=brIn.readLine())!=null){
        if(line.equals("over")){
           break;
        }  //
这个if()语句虽然与前面例子不同放到了while循环的最前面,但是跟放到最后的效果一样,不影响程序的正确性
        pw.println("你好Client,您的消息已收到!");
        System.out.println("Client:"+line);
      }
         s.close();
         ss.close();  //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流
   }
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: