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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了采用tcp协议,使用socket编程,编写程序完成客户端发送消息给服务端,服务端接到消息后,再发相关的知识,希望对你有一定的参考价值。

给客户端

参考技术A 服务端代码:
/*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);
追问

这个c的我想求java的

追答

请看博客
http://www.jb51.net/article/45024.htm

基于 TCP/IP 协议的网络编程

在说明基于 TCP/IP 协议的网络编程之前,先来了解一下 Socket(网络套接字):
  • 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准
  • 通信的两端都要有 Socket,是两台机器间通信的端点(API 原话)
  • 网络通信其实就是 Socket 间的通信
  • Socket 允许程序把网络连接当成一个数据在两个 Socket 间通过 IO 传输
  • 一般主动发起通信的应用程序属客户端,等待通信请求的服务
网络编程某种程度上可以称作“Socket 编程”

TCP/IP 编程,简单模拟客户端与服务端之间的交互(先开 Server 再开 Client):
  1. public class TestTCP {
  2. @Test
  3. public void client() {
  4. Socket socket = null;
  5. OutputStream os = null;
  6. try {
  7. // 创建 Socket 对象以指明目标 Server 的 IP 和端口
  8. socket = new Socket("127.0.0.1", 9876);
  9. // 调用该套接字对象的 getOutputStream()方法返回 OutputStream 对象以写出数据
  10. os = socket.getOutputStream();
  11. // 后面实际就是 IO 流的应用
  12. os.write("This is the message sent by client".getBytes());
  13. } catch (UnknownHostException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } finally {
  18. if (os != null) {
  19. try {
  20. os.close();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. // socket 也是稀有资源,记得及时关闭
  26. if (socket != null) {
  27. try {
  28. socket.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }
  35. @Test
  36. public void server() {
  37. ServerSocket ss = null;
  38. Socket socket = null;
  39. InputStream is = null;
  40. try {
  41. // 创建 ServerSocket 对象指明开放那个端口作为传输端口
  42. ss = new ServerSocket(9876);
  43. // 调用 accept()方法,返回一个 Socket 对象,监听 ServerSocket 对应的端口并且接受对该端口的连接
  44. socket = ss.accept();
  45. // 调用该套接字对象的 getInputStream()方法返回 InputStream 对象以写入从 client 接收到的数据
  46. is = socket.getInputStream();
  47. // 后面实际就是 IO 流的应用
  48. byte[] b = new byte[10];
  49. int len;
  50. while ((len = is.read(b)) != -1) {
  51. // 打印字节流
  52. System.out.print(new String(b, 0, len));
  53. }
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. } finally {
  57. if (is != null) {
  58. try {
  59. is.close();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. if (socket != null) {
  65. try {
  66. socket.close();
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. if (ss != null) {
  72. try {
  73. ss.close();
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. }
  79. }
  80. }

若要实现多步交互,注意 Socket 方法的阻塞性问题,如果一直监听端口,就不能执行后续代码,故记得调用相关 shutdown 方法以关闭监听,以下例子修改自上例,实现在 Server 端收到字节流后,返回给 Client 一条反馈信息:
  1. public class TestTCP {
  2. @Test
  3. public void client() {
  4. Socket socket = null;
  5. OutputStream os = null;
  6. InputStream is = null;
  7. try {
  8. // 创建 Socket 对象以指明目标 Server 的 IP 和端口
  9. socket = new Socket("127.0.0.1", 9876);
  10. // 调用该套接字对象的 getOutputStream()方法返回 OutputStream 对象以写出数据
  11. os = socket.getOutputStream();
  12. // 后面实际就是 IO 流的应用
  13. os.write("This is the message sent by client".getBytes());
  14. // ----------update----------
  15. // 显式的禁用此套接字的输出流
  16. socket.shutdownOutput();
  17. // 接受反馈
  18. is = socket.getInputStream();
  19. byte[] b = new byte[10];
  20. int len;
  21. while ((len = is.read(b)) != -1) {
  22. System.out.print(new String(b, 0, len));
  23. }
  24. // ----------update----------
  25. } catch (UnknownHostException e) {
  26. e.printStackTrace();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. } finally {
  30. if (os != null) {
  31. try {
  32. os.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. // socket 也是稀有资源,记得及时关闭
  38. if (socket != null) {
  39. try {
  40. socket.close();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }
  46. }
  47. @Test
  48. public void server() {
  49. ServerSocket ss = null;
  50. Socket socket = null;
  51. InputStream is = null;
  52. OutputStream os = null;
  53. try {
  54. // 创建 ServerSocket 对象指明开放那个端口作为传输端口
  55. ss = new ServerSocket(9876);
  56. // 调用 accept()方法,返回一个 Socket 对象,监听 ServerSocket 对应的端口并且接受对该端口的连接
  57. socket = ss.accept();
  58. // 调用该套接字对象的 getInputStream()方法返回 InputStream 对象以写入从 client 接收到的数据
  59. is = socket.getInputStream();
  60. // 后面实际就是 IO 流的应用
  61. byte[] b = new byte[10];
  62. int len;
  63. while ((len = is.read(b)) != -1) {
  64. // 打印字节流
  65. System.out.print(new String(b, 0, len));
  66. }
  67. // ----------update----------
  68. // 反馈一条消息给 Client
  69. os = socket.getOutputStream();
  70. os.write("I have received your message".getBytes());
  71. // ----------update----------
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. } finally {
  75. if (os != null) {
  76. try {
  77. os.close();
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. if (is != null) {
  83. try {
  84. is.close();
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. if (socket != null) {
  90. try {
  91. socket.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. if (ss != null) {
  97. try {
  98. ss.close();
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. }
  104. }
  105. }

以上是关于采用tcp协议,使用socket编程,编写程序完成客户端发送消息给服务端,服务端接到消息后,再发的主要内容,如果未能解决你的问题,请参考以下文章

Socket网络编程

Socket网络编程

基于 TCP/IP 协议的网络编程

java Socket编程

Java基础知识—网络Socket

GO语言Socket编程详解