黑马程序员 网络编程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培训、期待与您交流!-------------------
- 黑马程序员 网络编程2
- 【黑马程序员】网络编程
- 黑马程序员 网络编程
- 黑马程序员:网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员:网络编程
- 黑马程序员--网络编程
- 黑马程序员--网络编程
- 黑马程序员-网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员-----网络编程
- 黑马程序员-网络编程
- 黑马程序员-网络编程
- 黑马程序员 网络编程
- 黑马程序员----- 网络编程
- 黑马程序员 网络编程
- 利用Command创建执行SQL语句的模块
- [IDA] 分析for循环的汇编代码
- 通过虚函数表调用虚函数与通过虚函数表(绕过访问权限控制)
- 原来linux的虚拟终端是无法显示中文的
- 动态修改 CPropertyPage 名称
- 黑马程序员 网络编程2
- 获取Fragment的context
- 删除目录下相同文件
- Linux System Administration
- c#+jquery-autocomplete实现类似百度,Google模糊查询
- android游戏引擎汇总
- 设计模式:view.post() 责任链模式
- hdu4548 美素数
- 让你自己写的Android的Launcher成为系统中第一个启动的,也是唯一的Launcher.