以下哪个类用于实现tcp通信的客户端程序

以下哪个类用于实现tcp通信的客户端程序,第1张

Socket类。

在选项serversocket,socket, client,server中,正确答案是socket。

在JDK中提供了两个用于实现TCP程序的类,一个是ServerSocket类,用于表示服务器端;另一个是Socket类,用于表示客户

服务器(TCP/IP)编程实例

现在大多数语言都支持客户-服务器模式(C/S)编程,其中VB给我们提供了很好的客户-服务器编程方式。下面我们用VB来实现TCP/IP网络编程。

TCP/IP协议是Internet最重要的协议。VB提供了WinSock控件,用于在TCP/IP的基础上进行网络通信。当两个应用程序使用Socket进行网络通信时,其中一个必须创建Socket服务器侦听,而另一个必须创建Socket客户去连接服务器。这样两个程序就可以进行通信了。

①创建服务器

首先创建一个服务端口号。并开始侦听是否有客户请求连接。

建立一窗体,并向其增加一个Winsock控件(可在工程菜单中的部件项来添加此控件)

添加两文本框Text1,Text2,和一按钮Command1

Private Sub Form_Load()

SockServer.LocalPort = 2000 ′服务器端口号,最好大于1000

SockServer.Listen ′开始侦听

End Sub

Private Sub Form_Unload(Cancel As Integer)

SockServer.Close

End Sub

Private Sub SockServer_Close()

SockServer.Close

End Sub

Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)

SockServer.Close

SockServer.Accept requestID ′表示客户请求连接的ID号

End Sub

′当客户向服务器发送数据到达后,产生DataArrival事件,在事件中接收数据,GetData方法接收数据。

Private Sub SockServer_Data

Arrival(ByVal bytesTotal As Long)

Dim s As String

SockServer.GetData s

Text1.Text = s

End Sub

当需要向客户发送数据时,只需调用SendData方法。

Private Sub Command1_Click()

SockServer .SendData Text2.Text

End Sub

②创建客户

要创建客户连接服务器,首先设置服务器主机名,如IP地址、域名或计算机名,然后设置服务器端口,最后连接服务器。

建立一窗体,并向其增加一个Winsock控件(可在工程菜单中的部件项来添加此控件),取名为:SockC1。添加两文本框Text1,Text2,和一按钮Command1

Private Sub Form_Load()

SockCl.RemoteHost =′127.0.0.1″

′表示服务器主机名

SockCl.RemotePort = 2000

  ′表示服务器端口名

SockCl.Connect

′连接到服务器

End Sub

Private Sub Form_Unload(Cancel As Integer)

SockCl.Close

End Sub

Private Sub SockCl_Close()

SockCl.Close

End Sub

Private Sub SockCl_DataArrival(ByVal bytesTotal As Long)

Dim s As String

SockCl.GetData s ′接收数据到文本框中

Text1.Text = s

End Sub

Private Sub Command1_Click()

SockCl.SendData Text2.Text ′向服务器发送数据

End Sub

③进行通信

把这两个窗体分别编译成两个EXE文件,服务器Server.exe和客户Client.exe程序,并把它们分别安装在服务器端和客户端,这样就可以实现两者通信了。

-

该服务器完成将客户端发送的内容转换成大写,并发送到客户端(注意:服务器只支持一个客户端连接,后面我们会使用多进程,多线程,select,poll,epoll来完善我们的服务器,使之支持多个客户端连接)

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <errno.h>

#include <ctype.h>

#define SERV_PORT 7000

//running command: "./server_tcp -p 7001"

int main(int argc, char** argv)

{

        int opt

        int port = SERV_PORT

        while((opt = getopt(argc, argv, "p:")) != -1){

            switch (opt){

              case 'p': port = atoi(optarg)

                      break

              default: break

            }

        }

        struct sockaddr_in serv_addr, clnt_addr

        socklen_t clnt_len

        int lfd, cfd

        int n, i

        char buf[BUFSIZ]

        lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

        if(lfd <0){

                printf("%s\n", "socket error")

                exit(1)

        }

        serv_addr.sin_family = AF_INET

        serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")

        serv_addr.sin_port = htons(port)

        bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))

        listen(lfd, 128)

        clnt_len = sizeof(serv_addr)

        cfd = accept(lfd, (struct sockaddr*)&clnt_addr, &clnt_len)

        if(cfd == -1){

            printf("accept error\n")

            if(errno == EAGAIN || errno == EWOULDBLOCK){

                    printf("normal error")

            }else{

                printf("innormal error\n")

                return -1

            }

        }

        while(1){

          n = read(cfd, buf, BUFSIZ)

          if(n >0){

                printf("receive centent: %s\n", buf)

                for(i = 0i <ni++){

                        buf[i] = toupper(buf[i])

                }

          }

          write(cfd, buf, n)

        }

        close(cfd)

        close(lfd)

        return 0

}

客户端可以省略,使用nc命令可以模拟客户端连接: nc 127.1 7001

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

int main()

{

struct sockaddr_in serv_addr

int lfd

lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

serv_addr.sin_family = AF_INET

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")//服务器和客户端IP相同

serv_addr.sin_port = htons(6666)

connect(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))

write(lfd, "hello socket", strlen("hello socket"))

char rbuf[BUFSIZ]

read(lfd, rbuf, BUFSIZ)

printf("rbuf=%s\n", rbuf)

close(lfd)

return 0

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存