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中非常常用的方法。