黑马程序员_<>

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


 

1. TCP/IP

     1.概述

 

           要创建链接,能够传输大量数据  经过三次握手玩成链接是可靠协议   必须创建链接,效率低,例如:下载,打电话服务器

           步骤:Socket和ServerSocket网络

简介:创建客户端和服务器端socket

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

         关闭socket.net

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

 

     2.传输

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

      客户端:在该对象建立的时候,就指定了主机地址,由于要先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培训、期待与您交流! --------------------

相关文章
相关标签/搜索