java网络编程应该怎样在客户端和服务器间实现通信?

java网络编程应该怎样在客户端和服务器间实现通信?,第1张

以前写的,照贴了。。。服务器端:import java.awt.*

import java.awt.event.WindowAdapter

import java.awt.event.WindowEvent

import java.io.*

import java.net.*/*6、 采用UDP协议,编写一个Java网络应用程序,该应用分服务器端程序和客户端程序两部分。

* 客户端指定一个服务器上的文件名,让服务器发回该文件的内容,或者提示文件不存在。

* (20分)(服务端程序和客户端程序分别命名为Server.java和Client.java)*/

public class N4BT6 extends Frame

{

DatagramSocket socket

DatagramPacket packet byte[] buf

File file

FileInputStream input

String message = "该文件不存在"

TextArea text

public N4BT6(String title)

{

super(title)

text = new TextArea(6,4)

add(text)

setSize(400, 300)

setVisible(true)

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

dispose()

}

})

buf = new byte[1024]

try

{

socket = new DatagramSocket(1230)

packet = new DatagramPacket(buf, buf.length)

socket.receive(packet)

file = new File(new String(packet.getData()))

socket = new DatagramSocket()

}

catch (Exception e)

{e.printStackTrace()

}

if(file.exists())

{

try

{

buf = new byte[(int)file.length()]

packet = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),1234)

input = new FileInputStream(file)

input.read(buf)

socket.send(packet)

}

catch (IOException e)

{

e.printStackTrace()

}

}

else

{

try

{

packet = new DatagramPacket(message.getBytes(),message.getBytes().length,

InetAddress.getLocalHost(),1234)

socket.send(packet)

}

catch (Exception e)

{

e.printStackTrace()

}

}

}

public static void main(String[] args)

{

new N4BT6("Server")

}

}

客户端:import java.awt.*

import java.awt.event.*

import java.net.DatagramPacket

import java.net.DatagramSocket

import java.net.InetAddresspublic class N4BT6_2 extends Frame

{

TextArea text

String message = "Q.txt"

DatagramSocket socket

DatagramPacket packet

byte[] buf

public N4BT6_2(String title)

{

super(title)

text = new TextArea(6,4)

add(text)

setSize(400, 300)

setVisible(true)

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

dispose()

}

})

try

{

socket = new DatagramSocket()

packet = new DatagramPacket(message.getBytes(),message.getBytes().length,

InetAddress.getLocalHost(),1230)

socket.send(packet)

}

catch (Exception e)

{

e.printStackTrace()

}

try

{

buf = new byte[1024]

socket = new DatagramSocket(1234)

packet = new DatagramPacket(buf,buf.length)

socket.receive(packet)

text.append(new String(buf))

}

catch (Exception e)

{

e.printStackTrace()

}

}

public static void main(String[] args)

{

new N4BT6_2("Client")

}

}

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

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

1

2

3

4

5

6

7

8

9

10

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 <stdio.h>

#include <winsock2.h>

#include <winsock2.h>

#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 <stdio.h>

#include <stdlib.h>

#include <winsock2.h>

#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()

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/292249.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-24
下一篇2023-04-24

发表评论

登录后才能评论

评论列表(0条)

    保存