socket是tcp还是udp
SOCKET是API,TCP/UPD是通信协议,两个不是一个概念
都可以 socket是网络套接字 它可以使用tcp和udp两种传输协议
tcp/ip 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

通过udp socket如何传递自定义类对象
1.定义类 定义类,implements Serializable 接口,但不用实现任何方法;发送和接收双方,进行类定义时,package 名 和 类名 必须一致如:package com.baggio.dhs.protocol;import Java.io.Serializable;public class PacketHead implements Serializable{/****/private static final long serialVersionUID = 1L;private byte start;private byte type;private short datalen;private int sender_address;private short serial_no;private short frame_count;private static short data_id=0;private byte subtype;private byte check_bit;public PacketHead(){}public PacketHead(byte type, byte subtype, short datalen){this.start=0x7F;this.type=type;this.datalen=datalen;this.sender_address=0;this.serial_no=0;this.frame_count=1;this.data_id++;this.subtype=subtype;this.check_bit=0;}public byte getType(){return type;}public PacketHead setType(byte type){this.type=type; return this;}public byte getSubtype(){return subtype;}public PacketHead setSubtype(byte subtype){this.subtype=subtype; return this;}public int getSenderAddress(){return sender_address;}public PacketHead setSenderAddress(int sender_address){this.sender_address=sender_address; return this;}}2.发送方,进行发送对象的序列化package com.baggio.dhs.protocol;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.NET.DatagramPacket;import java.Net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class SendObject{public static void main(String[] args){DatagramSocket dSocket = null;InetAddress local=null;try {local = InetAddress.getByName("192.168.1.89");} catch (UnknownHostException e) {e.printStackTrace();}try {dSocket = new DatagramSocket(6001);} catch (SocketException e) {e.printStackTrace();}PacketHead message=new PacketHead((byte)0x71, (byte)0x41, (short)0x00);ByteArrayOutputStream bout=new ByteArrayOutputStream();ObjectOutputStream oout = null;try {oout = new ObjectOutputStream(bout);oout.writeObject(message);oout.flush();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}//序列化对象byte[] sendBuff=bout.toByteArray(); //转化为字节数组DatagramPacket dPacket=new DatagramPacket(sendBuff,sendBuff.length,local,24202);/*String message=new String("hello world");DatagramPacket dPacket=new DatagramPacket(message.getBytes(), message.length(), local, 24202);*/try {dSocket.send(dPacket);} catch (IOException e) {e.printStackTrace();}dSocket.close();System.out.println("Send success");}}3.接收方 ,进行反序列化,获得对象package com.baggio.dhs.protocol;。。。。。。。。mSocket.receive(packet);String fromIP=packet.getAddress().getHostAddress();int fromPort=packet.getPort();PacketHead message=new PacketHead();ByteArrayInputStream bint=new ByteArrayInputStream(recvBuff);ObjectInputStream oint=new ObjectInputStream(bint);message=(PacketHead)oint.readObject(); //反序列化,恢复对象 Log.i(MY_TAG, "type="+message.getType()+"subtype"+message.getSubtype());

简述基于TCP和UDP的Socket编程的异同
Socket有两种主要的操作方式:面向连接的和无连接的。无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM). 流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因此流式套接字可以保证数据传输的正确性。 数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。
tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。
tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。 TCP是一种很保险的链接,需要三次握手,所以数据的发送不会丢失,能根据网络的拥塞自动调整发送的时延,,,而UDP是一种不保险的链接,数据发出去后不管对面会不会收到,多用于语音视频通话中。
实现方法 以及API 不同。运用的地方不同。当然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;(4)UDP段结构比TCP的段结构简单,因此网络开销也小。 具体二种协议没有好坏,只有适合,有时候二者结合,比如QQ就是两种协议都有,比如组播通信的时候只能用udp

UDP 和 TCP 的 socket 分别一般用在什么地方
1.UDP是面向分组的,分组间有明确的边界;TCP是面向流字符的,数据流间无边界。 UDP发送一个分组,接收方或者接收完全失败,如果成功整个分组都会接收到。对于TCP,发送一串数字(1,2,3,4,5),接收时有可能变成两次(1,2)和(2,4,5),或者变成任意接收方式,协议栈只保证接收顺序正确。2.UDP属于非连接状态下的不可靠协议,实际运用中很少用到UDP,UDP对于网络资源消耗很少,可以用UDP进行nat穿透。TCP一般用于连接状态下的可靠的协议,比如http,telnet,smtp。3.TCP是可靠的,通过数据校验保证发送和接收到的数据是一致的;UDP是不可靠的,发送一串数字分组(1,2,3)可能接收到时就变成(1,0,0)了,做UDP连接时需要自己做数据校验。4.UDP是无序的,发出(1,2,3),有可能按照(1,3,2)的顺序收到,应用程序必须自己做分组排序;TCP数据是有序的,以什么顺序发送的数据,接收时同样会按照此顺序。5.TCP因为建立连接、释放连接、IP分组校验排序等需要额外工作,速度较UDP慢许多。TCP适合传输数据,UDP适合流媒体。 6.UDP比TCP更容易穿越路由器防火墙。

udp socket 关于在一个程序里实现发送和接收
发送程序Sender.cpp: #include#include#include#includeusing namespace std;//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib")struct test {string str;};struct UdpHeartPack {char UDPData[16] ;};int main(int argc, char* argv[]){struct UdpHeartPack udpPack;static int UDP_PORT = 7001;udpPack.UDPData[0] = 'h';udpPack.UDPData[1] = 'e';udpPack.UDPData[2] = 'l';udpPack.UDPData[3] = 'l';udpPack.UDPData[4] = 'o';udpPack.UDPData[5] = ' ';udpPack.UDPData[6] = 'w';udpPack.UDPData[7] = 'o';udpPack.UDPData[8] = 'r';udpPack.UDPData[9] = 'l';udpPack.UDPData[10] = 'd';udpPack.UDPData[11] = ' ';char *pPack = (char *) &udpPackWSADATA wsaData;//指向WinSocket信息结构的指针SOCKET sockListener;//创建套接字SOCKADDR_IN saUdpServ;//指向通信对象的结构体指针BOOL fBroadcast = TRUE; //用于setsockopt(),表示允许char sendBuff[800]; //缓冲区存放发送的数据int ncount=0; //用于显示消息数目//*************************** 第一步初始化Winsock *****************************//if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化{printf("Can't initiates windows socket!Program stop.n");//初始化失败返回-1return -1;}//******************** 第二步建立一个数据报类型的UDP套接字******************//sockListener=socket(PF_INET,SOCK_DGRAM,0);// setsockopt函数用于设置套接口选项// 采用广播形式须将第三个参数设置为SO_BROADCASTsetsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );//参数设置,注意要将IP地址设为INADDR_BROADCAST,表示发送广播UDP数据报saUdpServ.sin_family = AF_INET;saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );saUdpServ.sin_port = htons (UDP_PORT); //发送用的端口,可以根据需要更改while(1) //循环发送数据{Sleep(1000);sprintf(sendBuff,"Message %d is: ok",ncount++);//将ncount的值放入字符串senBuff中//**********************第三步使用sendto函数进行通信*************************//sendto ( sockListener,/*sendBuff*/pPack, lstrlen (sendBuff)/*sizeof(udpPack)*/, 0, (SOCKADDR *) &saUdpServ, sizeof (SOCKADDR_IN));printf("%sn",sendBuff);//将要广播的数据串输出}//********************* 第四步关闭socket***************************************//closesocket(sockListener); //关闭监听socketWSACleanup();return 0;}const static intBUFFER_LENGTH = 12;接收端程序Receiver.cpp:#include#include#include//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]){WSADATA wsaData; //指向WinSocket信息结构的指针SOCKET sockListener;SOCKADDR_IN sin,saClient;//设置两个地址,sin用来绑定//saClient用来从广播地址接收消息char cRecvBuff[800]; //定义接收缓冲区int nSize,nbSize;int iAddrLen=sizeof(saClient);if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化{printf("Can't initiates windows socket!Program stop.n");//初始化失败返回-1return -1;}sockListener=socket(AF_INET, SOCK_DGRAM,0);sin.sin_family = AF_INET;sin.sin_port = htons(7001); //发送端使用的发送端口,可以根据需要更改sin.sin_addr.s_addr = htonl(INADDR_ANY);if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0){printf("Can't bind socket to local port!Program stop.n");//初始化失败返回-1return -1;}while(1){nSize = sizeof ( SOCKADDR_IN );if((nbSize=recvfrom (sockListener,cRecvBuff,800,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误{printf("Recive Error");break;}cRecvBuff[nbSize] = ' ';//字符串终止printf("%sn",cRecvBuff);//显示所接收到的字符串}return 0; }

本文由 在线网速测试 整理编辑,转载请注明出处。