您的位置:首页 > 理论基础 > 计算机网络

网络编程 UDP TCP传输数据

2017-10-13 21:29 579 查看
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);
//监听
94ef
客户端(卡在这块进行监听)
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: