数据报的使用

首先是一个工具类:

public class Dgram {
	public static DatagramPacket toDatagram (
			String s ,InetAddress destIA, int destPort){
		byte [] buf = new byte[s.length()+1] ;//这对防止截尾现象是非常重要的
		s.getBytes(0, s.length(), buf, 0);
		return new DatagramPacket(buf, buf.length,
				destIA, destPort) ;
	}

	public static String toString (DatagramPacket p){
		return new String(p.getData(), 0, p.getLength()) ;
	}

}

然后是服务器端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ChartterServer {
	static final int INPORT =1711;
	private byte [] buf = new byte[1000];
	private DatagramPacket dp =
			new DatagramPacket(buf, buf.length) ;
	private DatagramSocket socket ;

	public ChartterServer (){
		try {
			socket = new DatagramSocket(INPORT) ;
			System.out.println("server start") ;
			while (true) {
				socket.receive(dp) ;
				String rcvd = Dgram.toString(dp)+"from:"+
				dp.getAddress()+"port:"+ dp.getPort() ;
				System.out.println(rcvd) ;
				String echoString = "Echo:"+ rcvd ;
				DatagramPacket echo = Dgram.toDatagram(echoString,
						dp.getAddress(), dp.getPort()) ;
				socket.send(echo) ;
			}
		} catch (SocketException e) {
			System.err.println("can not open socked") ;
			System.exit(1) ;
 		}catch (IOException e) {
 			System.err.println("communication erro") ;
 			e.printStackTrace() ;
		}
	}

	public static void main (String [] args ){
		new ChartterServer() ;
	}
}

  客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class ChatterClient extends Thread  {
	static final int INPORT =1711;
	private DatagramSocket s ;
	private InetAddress hostAddress ;
	private byte [] buf = new byte[1000] ;
	private DatagramPacket dp = new
			DatagramPacket(buf, buf.length) ;
	private int id ;

	public ChatterClient (int id ){
		this.id = id ;
		try {
			s = new DatagramSocket() ;
			hostAddress = InetAddress.getByName(null) ;
		} catch (SocketException e) {
			System.err.println("canot open socked") ;
			System.exit(1) ;
		} catch (UnknownHostException e) {
			System.out.println("can not find host") ;
			e.printStackTrace();
		}
		System.out.println("chatterclient start") ;
	}

	public void run (){
		try {
			for (int i =0; i<25; i++){
				String outMsg = "client id:"+id+"msg:"+ i ;
				s.send(Dgram.toDatagram(outMsg,
						hostAddress, INPORT)) ;
				s.receive(dp) ;
				String rcvd = "client id :"+ id+"rcvd from:"+
				dp.getAddress()+":"+dp.getPort()+Dgram.toString(dp) ;
				System.out.println(rcvd) ;
			}
		} catch (IOException e) {
			e.printStackTrace() ;
			System.exit(1) ;
		}
	}

	public static void main (String [] args){
		for (int i=0;i<10; i++){
			new ChatterClient(i).start() ;
		}
	}
}

  

时间: 2024-10-28 10:26:19

数据报的使用的相关文章

《TCP/IP详解卷2:实现》笔记--UDP:用户数据报协议

用户数据报协议,即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作只产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口,来访问UDP.该类型插口默认地称为无连接的.每次进程发送 数据时,必须指定目的IP地址和端口号.每次从插口上接收数据报时,进程可以从数据报中收到源IP地址和端口号. UDP插口也可以被连接到一个特殊的IP地址和端口,这样,所有写到该插口的数据报都被发往该目的地,而且只有来自该IP 地址和端口号的数据

Linux_C socket 数据报之一些辅助函数

1 /******************************************************************** 2 * dgram.c 3 * support functions for datagram based programs 4 */ 5 #include <stdio.h> 6 #include <unistd.h> 7 #include <sys/types.h> 8 #include <sys/socket.h>

java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案

1 try { 2 //向指定的ip和端口发送数据~! 3 //先说明一下数据是谁发送过来的! 4 byte[] ip = InetAddress.getLocalHost().getHostAddress().getBytes(); 5 dp = new DatagramPacket(ip, ip.length, sendIAD, QQReceive.getPort()); 6 ds.send(dp); 7 8 //这里主要是因为多可数据报包发送时会产生丢包的情况...所以暂停一段时间! 9

数据报截断

当一个到达的UDP数据报超过应用程序提供的缓冲区容量时,recvmsg在其 msghdr结构的msg_flags成员上设置MSG_TRUNC标志. 所有支持msghdr结构及其msg_flags成员的实现都提供这种通知.但并非所有实现都以同一种方式处理超过预期长度的UDP数据报 存在三种情况: 1.丢弃超出部分的字节并向应用进程返回MSG_TRUNC标志,调用recvmsg可以接收这个标志 2.丢弃超出部分的字节但不通知这个标志 3.保留超出部分的字节并在同一套接字后续的读操作中返回它们 实例

ajax往后台传json格式数据报415错误

问题描述: ajax往后台传json格式数据报415错误,如下图所示 页面代码 function saveUser(){ var uuId = document.getElementById("uuid").value; var idCard = document.getElementById("idCard").value; alert(uuId+idCard); // var result = new Object(); // result.uuId = uuI

Linux进程间通信 -- 数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套接字 socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信.也因为这样,套接字明确地将客户端和服务器区分开来. 相对于流套接字,数据报套接字的

关于SimpleCursorAdapter在sqlite数据库中取数据报错 : java.lang.IllegalArgumentException: column &#39;_id&#39; does not exist

_id列不存在 需要创建一个 id列 因为SQLlite数据库 的onCreate方法是在数据库不存在的时候才调用所以我们需要清除一下这个app 的数据 将数据清空 关于SimpleCursorAdapter在sqlite数据库中取数据报错 : java.lang.IllegalArgumentException: column '_id' does not exist

数据报的分片与组装

1.IP数据报格式 2.MTU MTU(最大传输单元):帧格式中的数据字段的最大长度. 3.分片 1)分片的条件 数据报长度超过网络所允许的最大传输单元MTU时,必须把过长的数据报进行分片后才能在网络上传输. 2)如何分片 对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值.该值在数据报分片时被复制到每个片中.标志字段用其中一个比特来表示"更多的片".除了最后一片外,其他每个组成数据报的片都要把该比特置1.片偏移字段指的是该片偏移原始数据报开始处的位置.另外,当数据报被分片

计算机网络(3)-----IP数据报格式

IP数据报(IP Datagram) 格式 解析 (1)版本 占4位,指IP协议的版本.通信双方使用的IP协议版本必须一致.目前广泛使用的IP协议版本号为4(即IPv4). (2)首部长度 占4位,可表示的最大十进制数值是15.请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节.当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充.因此数据部分永远在4字节的整数倍开始,这样在实现I

IP数据报首部校验和算法

当用google搜索IP数据报首部校验和算法的时候,总是看到的是代码,没有看到其过程,于是就有了此文,如有错误请指正.文章省略一点,呵呵 IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤: (1)把IP数据报的首部都置为0,包括校验和字段. (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和. (3)把得到的结果存入校验和字段中. 在接收数据时,计算数据报的校验和相对简单,按如下步骤: (1)