网络编程 UDP TCP传输数据

来源:互联网 发布:外汇模拟软件 编辑:程序博客网 时间:2024/06/05 15:21

1.

网络编程三要素

        A:IP地址:InetAddress: 网络中设备的标识,不易记忆,可用主机名
B:端口号: 用于标识进程的逻辑地址,不同进程的标识
C:传输协议: 通讯的规则常见协议:TCP,UDP
UDP和Tcp的区别
                UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报的大小在限制在64k;
因无连接,是不可靠协议;
不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道;(io流)
在连接中进行大数据量传输;
需要连接所以是可靠协议;
必须建立连接,效率会稍低
UDP协议发送数据

客户端(发送):       

                a: 创建UDP通讯客户端对象(DatagramSocket)

  b: 创建数据报包 public DatagramPacket(byte[] buf, int length,InetAddress address,int port)
  c: 发送 数据
  d: 释放资源
public class KeHuDuan {public static void main(String[] args) throws IOException {//创建客户端对象                DatagramSocket ds = new DatagramSocket();byte by[] = "你好".getBytes();int  len = by.length;InetAddress address = InetAddress.getByName("192.168.0.25");//创建数据报包DatagramPacket dp = new DatagramPacket(by, len, address, 9999);//发送数据ds.send(dp);ds.close();}}


UDP协议接收数据
服务端:
                a: 创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号
  b: 创建数据报包,作用用来接收数据  // public DatagramPacket(byte[] buf, int length)
c: 接收数据  receive(dp) ;
  d: 解析数据报包,拿出数据  dp.getData() ;  dp.getLength() ;

  e: 释放资源


public class FuWuDuan {public static void main(String[] args) throws IOException {//创建服务器对象            DatagramSocket ds = new DatagramSocket(9999);byte by[] = new byte[1024];int length = by.length;// 创建数据报包,作用用来接收数据DatagramPacket dp = new DatagramPacket(by, length);ds.receive(dp);//接受数据//解析数据报包  因为在客户端时,已将将数据包装好了,所以需要解析byte[] data = dp.getData();int length2 = dp.getLength();//获取IP地址InetAddress inetAddress = dp.getAddress();//获取IP地址对象String ip = inetAddress.getHostAddress();//返回IP地址字符串System.out.println(ip+new String(data, 0, length2));}}


例子2:客户端键盘循环输入,服务端显示


客户端程序
public class KeKuDuan {public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();// 客户端对象InetAddress address = InetAddress.getByName("192.168.0.25");//键盘录入BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入汉字");String lin = null;while ((lin = br.readLine()) != null) {System.out.println("请输入汉字");byte[] buf = lin.getBytes();int length = buf.length;//数据包对象DatagramPacket dp = new DatagramPacket(buf, length, address, 7777);            ds.send(dp);}ds.close();}}
服务端程序

public class FuWuDuan {public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket(7777);// 创建服务端对象while (true) {byte[] buf = new byte[1024];int length = buf.length;//创建数据报包 用来接收数据DatagramPacket dp = new DatagramPacket(buf, length);ds.receive(dp);// 解析数据包byte[] data = dp.getData();int length2 = dp.getLength();System.out.println(new String(data, 0, length2));}}}


TCP:例子1.客户端将数据发送给服务端
TCP协议发送数据

  a: 创建TCP通讯协议客户端对象(Socket)   // public Socket(String host, int port)
  b: 获取输出流对象(要将数据写进管道中)
  c: 写数据
  d: 释放资源
客户端程序
public class KeHuDuan {public static void main(String[] args) throws IOException{//创建客户端对象Socket sk = new Socket("192.168.0.25", 5555);//获取输出流对象(要将数据写进输出管道中)   OutputStream out = sk.getOutputStream();    out.write("你好".getBytes());sk.close();}}
TCP协议接收数据
a: 创建TCP通讯协议服务器端对象(ServerSocket)
  b: 监听客户端
  c: 获取输入流对象(要将数据从管道中读出来)
  d: 读取数据
  e: 释放资源


服务端程序
public class FuWuDuan {public static void main(String[] args) throws IOException {//创建服务端对象ServerSocket ss = new ServerSocket(5555);//监听客户端(卡在这块进行监听)Socket sk = ss.accept();InputStream in = sk.getInputStream();//每一个字节读取byte by[] = new byte[1024];int length = in.read(by);System.out.println(new String(by, 0, length));}}

例子2
客户端循环输入,服务器端把客户端的数据保存在文件中


客户端程序:
public class KeHuDuan {public static void main(String[] args) throws IOException {Socket sk = new Socket("192.168.0.25", 8888);//键盘录入BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//获取输出管道(将数据写进管道中)OutputStream out = sk.getOutputStream();//(这相当于管道)BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));//写进管道String lin = null;System.out.println("请输入");while((lin = br.readLine())!= null){System.out.println("请输入");bw.write(lin);bw.newLine();bw.flush();}}}
服务器端程序:


public class FuWuDuan {public static void main(String[] args) throws IOException {ServerSocket ss  = new ServerSocket(8888);System.out.println("等待连接中");Socket sk = ss.accept();//监听System.out.println("已连接上");//获取输入管道(把数据从管道中读出来)InputStream in = sk.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));//将读取到的数据写进文件中BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));String lin = null;while((lin = br.readLine())!=null){bw.write(lin);bw.newLine();bw.flush();}sk.close();}}

















原创粉丝点击