导航:首页 > IDC知识 > tcp协议的服务器socket对象

tcp协议的服务器socket对象

发布时间:2020-11-30 04:39:45

1、关于SOCKET tcp/ip协议通信

没看代码,只有猜测。

最可能的是终端READ的时候只READ了100个字节,这个可能是由于缓版存大小造成的,可能是显示权的表明了一次只READ100个字节。

那剩余的数据在哪?系统内核区的缓冲内,整个SOCKET的IO是这样的:网卡先读取数据到网卡的缓冲区内,然后复制系统内核区的缓冲区内(系统分配维护),最后READ读到用户区的缓冲内,你每次READ的这部分数据,系统会把这部分数据从内核缓冲区里FLUSH掉。所以你下次READ,就从上次读完的位置继续开始读,自然也就和粘合在一起了。这里也就隐含说明了一个问题,如果长期没有READ数据,但是服务器一直在往客户端发,这个系统的内核区的缓冲迟早要满的,这样就导致系统会将后来的包丢掉。

其他的问题,也不排除其他设置的问题,应该是小问题。

补充:那或许只是配置的问题了。没代码,只能猜

2、TCP/IP 使用Socket 实现客户端与服务器端通信

对于服务器,你先创建一个套接字(socket),然后bind绑定一个套接地址,然后你在用listen,此时你的服务器会一直阻塞在这,处于监听状态,检查是否有客户端来connect,一旦有的话,你的服务器就会accept。
所以,是你的服务器是处于监听状态,监听是否有客户端,然后由客户端来连接服务器,服务器接受客户端的连接,而不是服务器去连接客户端。

3、TCP/IP的 服务器和客户端之间的socket通信,一般用什么函数来发送数据?

看你用什么语言来;了 C# 里面如果你用自tcpclient tcplistener的话 这是对networkstream进行读写
write是发 read是收
send跟wirte都是视为发送 recv跟read都视为收取
可能区分在于 一个发送字符 一个发送byte[]的区别吧

4、java中,用哪一个类来表示tcp协议的服务器socket对象

服务端监复听:ServerSocket server=new ServerSocket(port);//port:绑定的端制口号
Socket client=server.accept();//监听端口,一旦取得连接则获得客户端的socket连接对象client

客户端: Socket s=new Socket(ip,port);//要连接的服务器的ip以及端口号

如果正常连接上之后,socket的对象可以获得InputStream和OutputStreame,然后就可以进行通信了

完成通信之后,执行socket对象的close()方法关闭连接,完成一次完整的socket连接

5、Java如何基于TCP协议远程传输对象

服务端监听:ServerSocket server=new ServerSocket(port);//port:绑定的端口号
Socket client=server.accept();//监听端口,一旦取得连接则获得客户端内的socket连接对象容client

客户端: Socket s=new Socket(ip,port);//要连接的服务器的ip以及端口号

如果正常连接上之后,socket的对象可以获得InputStream和OutputStreame,然后就可以进行通信了

完成通信之后,执行socket对象的close()方法关闭连接,完成一次完整的socket连接

6、socket,tcp,http三者之间的区别和原理

最大区别socket是网络层,http是应用成。。
socket是一个程序组件,它支持TCP,UDP等网络通讯协议专,也就是通过socket这个东西你属可以和任何互联网或局域网上的计算机通讯。。。TCP,UDP是一个网络层协议,网络层协议不管你发的内容是啥,他只负责把你想法的东西发到对面,发的是啥,他完全不管,因为他不是应用层。。。。
http是应用层协议,在socket的TCP层之上,他是管你发送的内容是什么的,比如你发的是啥,图片还是文字还是视频数据流,发成功了没有,用什么语言发,都做了详细的定义,这样可以保证写软件的人只要按照约定处理数据,就能得到想要的结果。。。
通讯的目的就是应用,所以应用是顶层,否则你发的是坨屎,还是别的什么,无从知道,因为数据都是二进制数据流,必须描述清楚,约定好。。。

7、JAVA socket基于TCP/IP协议编程,是这样写的JAVA代码,服务器端:I/O流和server

http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 对照的来例子 亲手源写一个 好好阅读文档 很容易就学会了

8、socket通信,TCP协议,有多个客户端,服务器怎么向指定IP及端口的客户端发送数据!

服务器是在等待中,当得到socket连接时,就得到了对端的端点地址。每个客户端是不同的端点地址。

9、采用tcp协议,使用socket编程,编写程序完成客户端发送消息给服务端,服务端接到消息后,再发

服务端代码:
/*server.c*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>

#define PORT 4321
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5

int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, recvbytes;
int sockfd, client_fd;
char buf[BUFFER_SIZE];

/*建立socket连接*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n",sockfd);

/*设置sockaddr_in 结构体中相关参数*/
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);

int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));

/*绑定函数bind*/
if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}
printf("Bind success!\n");

/*调用listen函数*/
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("Listening....\n");

/*调用accept函数,等待客户端的连接*/
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
{
perror("accept");
exit(1);
}

/*调用recv函数接收客户端的请求*/
memset(buf , 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
printf("Received a message: %s\n", buf);

if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
{
perror("send");
exit(1);
}
close(sockfd);
exit(0);
}

客户端:
/*client.c*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>

#define PORT 4321
#define BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
int sockfd, sendbytes;
char buf[BUFFER_SIZE];
struct hostent *host;
struct sockaddr_in serv_addr;

if(argc < 3)
{
fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");
exit(1);
}

/*地址解析函数*/
if ((host = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}

memset(buf, 0, sizeof(buf));
sprintf(buf, "%s", argv[2]);

/*创建socket*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}

/*设置sockaddr_in 结构体中相关参数*/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);

/*调用connect函数主动发起对服务器端的连接*/
if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)
{
perror("connect");
exit(1);
}

/*发送消息给服务器端*/
if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
{
perror("send");
exit(1);
}

if ((recvbytes = recv(sockfd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}

close(sockfd);
exit(0);
}

10、采用tcp协议的socket编程,假如服务器端不知道所要接收的数据的长度,如何定义接收buff的大小?

tcp是数据流。
如果你第一次的recv不能接收全部数据,可以再次调用recv接收剩专余的。
具体点:
你在发送的属时候可以把数据长度写在前4个字节,或者先发送数据长度过来。
接收的时候就能先知道数据长度,再动态分配内存,接收剩余数据。

这是socket中非常常用的方法。

与tcp协议的服务器socket对象相关的知识