黑马程序员——TCP协议传输(上)

——- android培训java培训、期待与您交流! ———-

TCP传输

*Socket和ServerSocket
*建立客户端和服务端
*建立连接后,通过Socket的IO流进行数据传输
*关闭Socket客户端得服务端是两个独立的程序

Socket类(客户端)

创建Socket可以使用new Socket()或者new Socket(InetAddress address,int port)即服务器IP和服务器端口号

ServerSocket类(服务器)

创ServerSocket的方法可以用new ServerSocket(int port),指定端口号,以便客户端连接     

下面我们写一示例来看看客户端与服务器是如何通信的
程序功能:客户端写一段话给服务器,服务回复一句话给客端

//客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
//10.41.83.132
public class SocketDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Socket s = null;
        try {
            //本地IP和端口
            s = new Socket("127.0.0.1",10000);
            //获取输出流(用于发送数据)
            OutputStream output = s.getOutputStream();
            //获取输入流(用于接收数据)
            InputStream input = s.getInputStream();
            //发送数据
            output.write("woshiku".getBytes());
            byte []buf = new byte[1024];
            //接收数据
            int len = input.read(buf);
            //打印数据
            System.out.println(new String(buf,0,len));
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
//服务端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            System.out.println("waitting connect.......");
            //创建服务器并指定端口
            ServerSocket ss = new ServerSocket(10000);
            //等待Socket,如果有客户端连接,获取客户端对象
            Socket s= ss.accept();
            //获取输入流(用于接收数据)
            InputStream input = s.getInputStream();
            //获取输出流(用于发送数据)
            OutputStream output = s.getOutputStream();
            byte []buf = new byte[1024];
            int len = input.read(buf);
            //打印客户端地址并打印收到的字符
            System.out.print(s.getInetAddress()+":");
            System.out.println(new String(buf,0,len));
            output.write("rece".getBytes());
            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

运行效果图

从中不难发现,服务端通过accept来获取Socket对象(客户端所创建的对象),从利用客户端的输入流与客户端的输出流形成了服务器读数据客户端发数据,利用客户端的输出流与客户端的输入流开成了服务器发数据和客户端读数据,也因此服务器才可以同时和多个客户进行通信。
如图所示:
这里写图片描述

我们再做一个程序,来更好掌握TCP传输!
示例二:要求从键盘录入数据,然后发送给服务器,服务把客户端的数据返回给客户端。
分析一下:键盘录入数据,那就用new BufferedReader(new InputStreamReader(System.in))将字节转成字符,并缓存,然后读取一行数据非常方便。发给客户端字符数据我们可以将客户端的输出流包装一下
InputStream input = s.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
便可以获取一行字符,非常方便读取字符!
当然不仅仅要发一次所以用要用到while()直到客户输入”over”结束通信,下面来看看代码吧!

//服务端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemoOne {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ServerSocket ss;
        try {
            //建立服务器并指定端口号
            ss = new ServerSocket(10000);
            System.out.println("server wait............");
            Socket s = ss.accept();
            System.out.println("server conntected..."+s.getInetAddress().getHostAddress());
            InputStream input = s.getInputStream();
            OutputStream output = s.getOutputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(input));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(output));
            String line = null;
            //等待客户端发送数据
            while((line=in.readLine())!=null){
                out.write(line);
                //如果不加行客户端收不到数据原因因为用了readLine()方法
                out.newLine();
                //输出缓存,字符要写否则发送少量数据会暂时收不到
                out.flush();    
            }
            out.close();
            s.close();
            ss.close();
            System.out.println("结束");
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }

}

//客户端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
 * 客户端给服务器发送数据,服务端回发给你客户端数据
 */
public class SocketDemoOne {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Socket s =null;
        try {
            //同示例一
            s = new Socket("127.0.0.1",10000);
            InputStream input = s.getInputStream();
            OutputStream output = s.getOutputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(input));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(output));
            //获取键盘输入
            BufferedReader fis = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("please input:");
            String line = null;
            //同服务器
            while((line=fis.readLine())!=null){
                if(line.equals("over")){
                    break;
                }
                out.write(line);
                out.newLine();
                out.flush();
                //收到服务器消息并打印
                String info = in.readLine();
                System.out.println("server:"+info);
                System.out.print("please input:");
            }
            //输出流返回-1
            s.shutdownOutput();
            out.close();
            s.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

效果图

——- android培训java培训、期待与您交流! ———-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值