黑马程序员 网络编程2

来源:互联网 发布:java可以在手机上编程 编辑:程序博客网 时间:2024/04/29 13:20


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



网络编程2



昨天主要讲述了UDP连接,今天再讲讲TCP连接

在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换。TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制。一个端点由 IP 地址和端口构成(专业术语为“元组 {IP 地址, 端口}”)。这样,一个连接就可以由元组 {本地地址, 本地端口, 远程地址, 远程端口} 来表示。

连接过程

在 TCP编程接口中,端点体现为 TCP 套接字。共有两种 TCP 套接字:主动和被动,“被动”状态也常被称为“侦听”状态。服务器和客户端利用套接字进行连接的过程如下:

1、服务器创建一个被动套接字,开始循环侦听客户端的连接。

2、客户端创建一个主动套接字,连接服务器。

3、服务器接受客户端的连接,并创建一个代表该连接的主动套接字。

4、服务器和客户端通过步骤 2和 3 中创建的两个主动套接字进行数据传输。

下面演示一个上传图片至服务器的小程序:

客户端:

package it.sun.day4;import java.io.*;import java.net.*;publicclass PicClient {    publicstaticvoid main(String[] args)throws UnknownHostException,IOException {       if(args.length!=1){           System.out.println("请选择一个jpg格式的图片");           return;       }       File file = new File(args[0]);       if(!(file.exists()&& file.isFile())){           System.out.println("该文件有问题");           return;       }       if(!file.getName().endsWith(".jpg")){           System.out.println("图片格式有误!");           return;       }       if(file.length()>10*1024*1024){           System.out.println("图片过大");           return;       }       Socket s = new Socket("localhost",10000);       FileInputStream fis = new FileInputStream(file);       OutputStream out =s.getOutputStream();       byte[] buf =newbyte[1024];       int len = 0;       while((len=fis.read(buf))!=-1)       {           out.write(buf, 0, len);       }       //告诉服务端,数据已写完       s.shutdownOutput();       InputStream in = s.getInputStream();       byte[] bufIn =newbyte[1024];       int num =in.read(bufIn);       System.out.println(new String(bufIn,0,num));       fis.close();       s.close();    }}


 
服务端:


package it.sun.day4;import java.net.ServerSocket;import java.net.Socket;import java.io.*;;class PicThreadimplements Runnable{    private Sockets;    public PicThread(Socket s) {       this.s = s;    }    publicvoid run(){         int count = 1;       String ip = s.getInetAddress().getHostAddress();       try{           System.out.println(ip+"-----connected");           InputStream in = s.getInputStream();           File file = new File(ip+"("+(count++)+")"+".jpg");           while(file.exists())              file = new File(ip+"("+(count++)+")"+"jpg")           FileOutputStream fos = new FileOutputStream(file);            byte[] buf =newbyte[1024];           int len = 0;           while((len=in.read(buf))!=-1){              fos.write(buf,0,len);           }           OutputStream out = s.getOutputStream();           out.write("上传成功".getBytes());           fos.close();           s.close();       }catch(Exception e){           throw new RuntimeException(ip+"上传失败!");       }    }}class PicServer{    publicstaticvoid main(String[] args)    {       ServerSocket ss = null;       try {           ss = new ServerSocket(10000,10);       } catch (IOException e) {           // TODO Auto-generatedcatch block           e.printStackTrace();       }       while(true){           Socket s = null;           try {              s = ss.accept();           } catch (IOException e) {              // TODO Auto-generatedcatch block              e.printStackTrace();           }           new Thread(new PicThread(s)).start();       }    }}


 

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