1. 首页 > 智能数码 >

socket客户端 javasocket客户端

windows socket 客户端怎么判断服务端已关闭

服务器端发起关闭,要让服务器发送RST而不是FIN,

socket客户端 javasocket客户端socket客户端 javasocket客户端


这时客户端收到RST后send会直接返回失败(这时就检测出服务器已关闭)而不是阻塞。

如果直接调用closesocket会发送FIN,

需要设置linger使closesocket直接发送RST

代码:

SOCKET

soc_client

=::accept(soc_listen,

(struct

sockaddr

*)&client_addr,

&len);

…struct

linger

so_linger;

so_linger.l_onoff

=1;

so_linger.l_linger

=0;

setsockopt(soc_client,

SOL_SOCKET,

SO_LINGER,

(char

*)&so_linger,

sizeof(so_linger));

socket编程怎么写一个客户端和两个服务端

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。

12

34

56

78

910

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

【服务器端】

#include "stdafx.h"

#include

#include

#include

#define SERVER_PORT 5208 //侦听端口

void main()

{WORD wVersionRequested;

WSADATA wsaData;

int ret, nLeft, length;

SOCKET sListen, sServer; //侦听套接字,连接套接字

struct sockaddr_in saServer, saClient; //地址信息

char *ptr;//用于遍历信息的指针

//WinSock初始化

wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本

ret=WSAStartup(wVersionRequested, &wsaData);

if(ret!=0)

{printf("WSAStartup() failed!\n");

return;

}//创建Socket,使用TCP协议

sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sListen == INVALID_SOCKET)

{WSACleanup();

printf("socket() faild!\n");

return;

}//构建本地地址信息

saServer.sin_family = AF_INET; //地址家族

saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序

saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址

//绑定

ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));

if (ret == SOCKET_ERROR)

{printf("bind() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //关闭套接字

WSACleanup();

return;

}//侦听连接请求

ret = listen(sListen, 5);

if (ret == SOCKET_ERROR)

{printf("listen() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //关闭套接字

return;

}printf("Waiting for client connecting!\n");

printf("Tips: Ctrl+c to quit!\n");

//阻塞等待接受客户端连接

while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。

{length = sizeof(saClient);

sServer = accept(sListen, (struct sockaddr *)&saClient, &length);

if (sServer == INVALID_SOCKET)

{printf("accept() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //关闭套接字

WSACleanup();

return;

}char receiveMessage[5000];

nLeft = sizeof(receiveMessage);

ptr = (char *)&receiveMessage;

while(nLeft>0)

{//接收数据

ret = recv(sServer, ptr, 5000, 0);

if (ret == SOCKET_ERROR)

{printf("recv() failed!\n");

return;

}if (ret == 0) //客户端已经关闭连接

{printf("Client has closed the connection\n");

break;

}nLeft -= ret;

ptr += ret;

}printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。

}// closesocket(sListen);

// closesocket(sServer);

// WSACleanup();

}【客户端】

#include "stdafx.h"

#include

#include

#include

#define SERVER_PORT 5208 //侦听端口

void main()

{WORD wVersionRequested;

WSADATA wsaData;

int ret;

SOCKET sClient; //连接套接字

struct sockaddr_in saServer; //地址信息

char *ptr;

BOOL fSuccess = TRUE;

//WinSock初始化

wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本

ret = WSAStartup(wVersionRequested, &wsaData);

if(ret!=0)

{printf("WSAStartup() failed!\n");

return;

}//确认WinSock DLL支持版本2.2

if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)

{WSACleanup();

printf("Invalid WinSock version!\n");

return;

}//创建Socket,使用TCP协议

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sClient == INVALID_SOCKET)

{WSACleanup();

printf("socket() failed!\n");

return;

}//构建服务器地址信息

saServer.sin_family = AF_INET; //地址家族

saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序

saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");

//连接服务器

ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));

if (ret == SOCKET_ERROR)

{printf("connect() failed!\n");

closesocket(sClient); //关闭套接字

WSACleanup();

return;

}char sendMessage[]="hello this is client message!";

ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);

if (ret == SOCKET_ERROR)

{printf("send() failed!\n");

}else

printf("client info has been sent!");

closesocket(sClient); //关闭套接字

WSACleanup();

}

SOCKET通信 客户端如何指定端口?

Server端代码

ServerSocket ss = new ServerSocket(8888);

Client端代码

Socket s = new Socket("127.0.0.1", 8888);

客户端的端口号应该看服务器端的端口号是多少,然后在创建Socket对象的时候,将端口号作为参数传递,来创建对象

其他人给你回的是win socket c语言的,java的一样,都封装好了,更简单。但是你要注意,只要经过路由设备,这个端口号就失效了

java socket 客户端是如何向服务器端发送消息的

java socket客户端向服务器端发送消息,可以使用socket类,实例如下: mport java.io.*;

import class EchoClient {

public static void main(String args[]) {

try {

Socket connection =new Socket("127.0.0.1", 5050);

BufferedReader input = new BufferedReader(new InputStreamReader(

connection.getInputStream()));

PrintWriter out = new PrintWriter(connection.getOutputStream(),true );

String info;

info = input.readLine();

System.out.println(info);

boolean done = false;

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

String sInput;

//out.println("BYE");

while (!done) {

info = input.readLine();

System.out.println(info);

}connection.close();

}catch (SecurityException e) {

System.out.println("SecurityException when connecting Server!");

}catch (IOException e) {

System.out.println("IOException when connecting Server!");

}}

}

基于C/S(即客户端/服务器)模式的通信,有使用面向连接协议(TCP)协议进行的,也可以用面向无连接的UDP协议的。不过就上述程序来看,是TCP Socket了。客户端和服务器通过Socket方式进行通信,Socket可以形象地理解成一个介于服务器和客户端的通道,通道的两端均通过该通道读取和写入Message,程序中的BufferedReader和PrintWriter均为I/O流,只是适用的对象不同而已,BuffedrReader是字符流,需套接在字节流上,用于读取信息,socket.getInputStream()表明读取的对象是Socket中输入的信息,PrintWriter用于向Socke中打印信息。另外,System.out.println()方法用于向标准输出设备输出信息。理解该程序时,需搞明白向哪个对象中读取还是写入信息。稍微抽象一点,不过不是很难,再好好看看书,仔细琢磨琢磨,相信你能明白的!

Socket 客户端重连机制

socket.connect连接不成功时候会抛出异常,try{}catch 捕获异常 继续调用连接函数,递归调用。

当然,如果很长时间都连接不上会占用很多堆栈。 给分吧少年

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息