黑马程序员_<<TCP>>

来源:互联网 发布:怎么利用淘宝赚钱 编辑:程序博客网 时间:2024/05/21 17:58

---------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------


1. TCP/IP

     1.概述

           要建立连接,可以传输大量数据  通过三次握手玩成连接是可靠协议   必须建立连接,效率低,例如:下载,打电话

           步骤:Socket和ServerSocket

简介:建立客户端和服务器端

         通过Socket中的IO流进行数据传输

         关闭socket

         同样,客户端和服务器端是两个独立的应用程序

 

     2.传输

           客户端(Socket)和服务器端(ServerSocket)

      客户端:在该对象创建的时候,就指定了主机地址,因为要先TCP必须要建立好连接,进行传输,或者使用connet方法来制定端口

 

     客户端对象里面封装了字节读取流和写入流。这样更方便发送和接受数据。不断是服务端还是客户端,只要是对其传输的数据进行访问,那么就在Socket对象中获取流。

步骤:

1.创建服务,指定连接的主机和端口

2.获得输出流 然后输出数据

3.关闭服务

服务端:

1建立服务端的服务,ServerSocket,绑定端口

2获取连接过来的客户端对象 ServerSocket的accept方法。

3客户端如果发过来数据,那么服务端要使用对应的客户端对象,然后客户端对象的读取流来读取发过来的数据,打印在控制台上

4关闭服务端。

 

     3.单向发出和读取

          模拟客户端向服务端发数据,服务端读取客户端发送的数据后,然后输出。

           

 import java.io.OutputStream;import java.net.Socket;/** * 客户端 * 1.定义服务端服务,指定目的地址和端口号 * 2.获得写入流,然后发发送的数据,并且发出 * 3.关闭客户端 * */public class CilentTcp {  public static void main(String[] args) throws Exception{    /*创建了客户端服务,并且指定目的主机和端口号*/    Socket client=new Socket("192.168.1.101",10005);    /*获取输出流,用来发送数据*/    OutputStream out=client.getOutputStream();    out.write("hello world".getBytes());    client.close();  } } 

import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;/** * 服务端 * 1.定义服务端,然后指定服务端口 * 2.使用accept()方法获得客户端对象,然后获取读取流 * 3.然后读取客户端发送的数据 */public class ServerTcp {  public static void main(String[] args) throws Exception {    /* 创建了服务端,并且指定端口号 */    ServerSocket server = new ServerSocket(10005);    Socket socket = server.accept();// 获得了发送端对象    InputStream in = socket.getInputStream();// 获得读取流,用来读取发送端发送过来的数据    byte[] buf = new byte[1024];    int r = in.read(buf);//读取    System.out.println(new String(buf, 0, r));  } } 结果:hello world

必须要先启动服务端,然后运行客户端,否则会连接失败

2. 客户端和服务端互访

     客户端:

         步骤:

1.建立Socket服务,并且指定要连接的主机和端口。

2.获得Socket流中的输出流,将数据写到流中,通过网络发送给服务端

3.获取Socket流中的输入流,将服务端反馈回来的数据获取到,并且打印

4.关闭客户端资源

 

mportjava.io.InputStream;importjava.io.OutputStream;import java.net.Socket;importjava.net.InetAddress;/** * 客戶端 */public class ClientTcp {      public static void main(String[]args) throws Exception {           /*获得客户端服务*/           Socketclient = new Socket("192.168.32.17", 25000);           /*            * 获得客户端流中的输出流,并且把数据写到流中,然后传给的服务端            */           OutputStreamout = client.getOutputStream();           out.write("服务端,你在吗".getBytes());           /**            * 获得客户端总的输出流,然后或得服务端反馈回来的数据,并且打印            */           InputStreamin=client.getInputStream();           byte [] buf=new byte[1024];           int len=in.read(buf);           System.out.println(newString(buf,0,len));           client.close();      } } 


     服务端:

        步骤:

1.建立ServerSocket服务,并且指定端口号。

2.获得客户端服务对象,输出客户端的地址

3.获得客户端的输入流,读取客户端发送的数据,并且打印。

4.获得客户端的输出流,给客户端发送反馈信息。

5.关闭服务端服务和客户端服务。

 

import java.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;import java.net.Socket;/** * 服务端 */public class ServerTcp {      public static void main(String[]args) throws Exception {           /* 创建了服务端,并且指定端口号 */           ServerSocketserver = new ServerSocket(25000);           Socketsocket =server.accept();// 获得了发送端对象           System.out.println(socket.getLocalAddress()+"connectsuccess");           /**            * 或得客户端的输入流,读取客户端发送的数据,并且打印            */           InputStreamin = socket.getInputStream();// 获得读取流,用来读取发送端发送过来的数据           byte[] buf = new byte[1024];           int r = in.read(buf);// 读取           System.out.println(new String(buf, 0,r));           /**            * 获得客户端的输出流,给客户端反馈信息            */           OutputStream  out=socket.getOutputStream();           out.write("客户端,我在呢?要干嘛啊!!".getBytes());           socket.close();           server.close();      }}


 

accept()和read()方法都是阻塞方法。

对于双方都通信的话,那么循环读取的话,用到IO读取,那么必须注意换行符,和刷新缓冲区。通常都是读取一行的话,那么要注意是否有换行符,newLine().

3.  上传文件

      在网络传输文件

       客户端:

          步骤:1.定义服务端,同样也要指定目标地址和端口号。

                2.定义对文件相应的流,读取文件。

                3.获取客户端的输出流,和文件的读取交替读取和写入。

                4.获得客户端的输入流,获取服务端反馈的信息。

 

                

 package www.fuxi.wangluo; import java.io.BufferedReader;import java.io.FileReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * 客户端 * @author yang */public class TextClient {  public static void main(String[] args) throws Exception{             Socket socket=new Socket("192.168.1.101",25001);             /**              * 获得文件的读取流,然后循环的读取文件              */             BufferedReader br=new BufferedReader(new FileReader("copy.txt"));             /**              * 获得服务端的输入流,用来把要复制的文件内容,输入到网络流中              */             PrintWriter pr=newPrintWriter(socket.getOutputStream(),true);//true代表自动刷新                         String line=null;             while((line=br.readLine())!=null){               pr.println(line);//println有自动刷新功能             }             socket.shutdownOutput();//关闭客户端的输出流,相当于结束标记                         /**              * 获得文件的输出流,用来获得服务端反馈的信息              */             BufferedReader brs=new BufferedReader(new InputStreamReader(socket.getInputStream()));             String str=null;             str=brs.readLine();             System.out.println(str);                         brs.close();             br.close();             socket.close();  } } 

 

      服务端:

            步骤:1.定义服务端服务,然后指定端口号。

                  2.获得客户端对象,然后从中获取读取流。

                  3.定义新文件的写入流,这样把读取流中的内容写入到新文件中。

                  4.获得客户端的写入流,反馈给客户端信息。

 

 

package www.fuxi.wangluo; import java.io.BufferedReader;import java.io.FileWriter;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * 服务端 */public class TextServer {  public static void main(String[] args) throws Exception {    /**     * 定义服务端,然后获得客户端服务对象     */    ServerSocket server = new ServerSocket(25001);    Socket socket=server.accept();    /**     * 获得客户端的读取流,这样读取文件内容     */    BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));    /**     * 获得目标文件的写入流,用来写入文件内容     */    PrintWriter pr=new PrintWriter(new FileWriter("newCopy.txt"),true);    String line=null;    while((line=br.readLine())!=null){      pr.println(line);    }    /**     * 获得客户端的写入流,这样把信息反馈给客户端     */    PrintWriter prs=new PrintWriter(socket.getOutputStream());    prs.println("上传成功!");    pr.close();    prs.close();    br.close();    server.close();  } } 结果:上传成功 


注意点:一定要定义结束标记,否则会不会停止上传,结束标记可以自定义,也可以使用Socket中自带的方法来结束。




---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

 


原创粉丝点击