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

一:简单案例:

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中获取,所以此处也不用关这两个流

   }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值