网络编程TCP

来源:互联网 发布:java 线程 通信 编辑:程序博客网 时间:2024/05/24 04:14

      TCP传输,客户端建立的过程

                   1.创建tcp客户端socket服务,使用的是socket对象。

                            建议改对象一创建就明确目的,要连接的主机

                   2.如果连接建立成功,说明数据传输通道已经建立

                            该通道就是socket流,是底层建立好的,既然是流,说明

                            这里既有输入又有输出。

                            想要输入或者输出流对象,可以找Socket对象来获取

                            可以通过getOutputStream(),getInputStream()来获取两个字节流

                   3.使用输出流,将数据写出

                   4.关闭资源

           tcp服务端的思路:

                            1.创建服务端socket服务,通过ServerSocket对象

                            2.服务端必须对外提供一个端口,否则客户端无法连接

                            3.获取连接过来的客户端对象

                   程序:

                 客户端:

                                     publicstatic void main(String[] args) throws UnknownHostException, IOException {

                                               //建立客户端socket对象

                                               Socketsocket = new Socket("10.64.100.11",10002);

                                               //获取输出流,源是本机内存,目的是外部设备网络

                                               OutputStreamout =  socket.getOutputStream();

                                               //从本地写入数据到输出流

                                               out.write("呵呵来了".getBytes());

                                               //获取从服务器端发来的提示信息

                                               InputStreamin = socket.getInputStream();

                                               byte[]buf = new byte[1024];

                                               intlen  = in.read(buf);

                                               syso(buf,0,len);

                                               //关闭资源

                                               socket.close();

                                     }

                      服务端:

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

                                                        //1.创建服务器对象

                                                        ServerSocketss  = new ServerSocket(10002);

                                                        //2.获取连接过来的客户端对象

                                                        Sockets = ss.accept();//阻塞式

                                                        //3.通过Socket对象获取输入流,要读取客户端发来的数据,源是外部设备网络,目的是服务器

                                                        InputStreamin = s.getInputStream();

                                                        byte[]buf = new byte[1024];

                                                        intlen = in.read(buf);

                                                        Stringip  =s.getInetAddress().getHostAddress();//获取ip地址字符串的表示形式

                                                        System.out.println(ip+":"+newString(buf,0,len));

                                                        //给客户端发送提示信息

                                                        OutputStreamout = s.getOutputStream();

                                                        out.write("收到".getBytes());

                                                        //ss.close();

                                                        s.close();

                                                       

                                               }

                   需求:

                 客户端输入字母数据,发送给服务端,服务端收到后显示在控制台中,并将数据转换成大写返回给客户端。

                            直到客户端输入over,转换结束。其实就是创建一个英文大写转换服务器

                                    程序

                                               publicstatic void main(String[] args) throws UnknownHostException, IOException {

                                     //1.创建Socket对象

                                     Sockets = new Socket("xx.xx.xx.xx", 10003);

                                     //2.获取输出流

                                     OutputStreamout  = s.getOutputStream();

                                     //3.获取输出的内容

                                     //Stringstr = "kkkkllla";

                                     //如果是键盘录入

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

                                     Stringline = null;

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

                                               byte[]buf = line.getBytes();

                                               out.write(buf);

                                               //4.获取转换后的流

                                               InputStreamin = s.getInputStream();

                                               //5.获取转换后的流并输出

                                               byte[]buf1 = new byte[1024];

                                               intlen = in.read(buf1);

                                               System.out.println("转换后的数据"+newString(buf1,0,len));

                                     }

                                     //6.关闭资源

                                     s.close();

                                     /*

                                      *第二种方法

                                      *27行开始

                                      * PrintWriter out = newPrintWriter(s.getOutputStream(),true);//自动刷新

                                      * BufferedReader bufIn = newBufferedReader(new InputStreamReader(s.getInputStream()));

                                      * while((line = bufr.readLine())!=null){

                                               out.println(line);

                                               //4.获取转换后的流

                                                *String toUpperStr =  bufIn.readLine()

                                               System.out.println("转换后的数据"+toUpperStr);

                                               }

                                      */

                            }

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

                                     //1.创建ServerSocket对象

                                     ServerSocketss = new ServerSocket(10003);

                                     //2.获取连接的客户端的Socket对象

                                     Sockets = ss.accept();

                                     //3.获取输入流

                                     InputStreamin = s.getInputStream();

                                     byte[]buf = new byte[1024];

                                     intlen = in.read(buf);

                                     Stringstr = new String(buf,0,len);

                                     str= str.toUpperCase();//转成大写

                                     //4.获取输出流

                                     OutputStreamout = s.getOutputStream();

                                     out.write(str.getBytes());

                                     //5.关闭资源

                                     s.close();

                                     ss.close();//通常不用关闭

                                     /*

                                      *第二种

                                      *19行开始

                                      * BufferedReader bufrIn = newBufferedReader(new InputStreamReader(s.getInputStream()));

                                      * PrintWriter out = newPritnWriter(s.getOutputStream());

                                      * String line = null;

                                      * while((line = bufrIn.readLine())!=null){

                                      * out.println(line.totoUpperCase());

                                      * }

                                      */

                            }

 

                   }

注意:如果遇到等待状态,一般就是阻塞式程序处于阻塞,例如如果上面的程序输出流不加入换行,则readLine()无法读到结束标志,处于等待。

如果上面的程序不带有刷新,则数据会存储在PrintWriter中,而不会写入OutputStream()中。