疯狂Java讲义:使用ServletSocket创建TCP服务器端

疯狂Java讲义:使用ServletSocket创建TCP服务器端,第1张

使用ServletSocket创建TCP服务器端

从图 中看上去TCP通信的两个通信实体之间并没有服务器端 客户端之分 但那是两个通信实体已经建立虚拟链路之后的示意图 在两个通信实体没有建立虚拟链路之前 必须有一个通信实体先做出 主动姿态 主动接收来自其他通信实体的连接请求

Java中能接受其他通信实体连接请求的类是ServerSocket ServerSocket对象用于监听来自客户端的Socket连接 如果没有连接 它将一直处于等待状态 ServerSocket包含一个监听来自客户端连接请求的方法

Socket accept() 如果接收到一个客户端Socket的连接请求 该方法将返回一个与客户端Socket对应的Socket(如图 所示每个TCP连接有两个Socket) 否则该方法将一直处于等待状态 线程也被阻塞

为了创建ServerSocket对象 ServerSocket类提供了如下几个构造器

ServerSocket(int port) 用指定的端口port来创建一个ServerSocket 该端口应该是有一个有效的端口整数值 ~

ServerSocket(int port int backlog) 增加一个用来改变连接队列长度的参数backlog

ServerSocket(int port int backlog InetAddress localAddr) 在机器存在多个 IP地址的情况下 允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址

当ServerSocket使用完毕 应使用ServerSocket的close()方法来关闭该ServerSocket 通常情况下 服务器不应该只接受一个客户端请求 而应该不断地接受来自客户端的所有请求 所以Java程序通常会通过循环 不断地调用ServerSocket的accept()方法 如下代码片段所示

//创建一个ServerSocket 用于监听客户端Socket的连接请求

ServerSocket ss = new ServerSocket( )

//采用循环不断接受来自客户端的请求

while (true)

{

//每当接受到客户端Socket的请求 服务器端也对应产生一个Socket

Socket s = ss accept()

//下面就可以使用Socket进行通信了

}

上面程序中创建ServerSocket没有指定IP地址 则该ServerSocket将会绑定到本机默认的IP地址 程序中使用 作为该ServerSocket的端口号 通常推荐使用 以上的端口 主要是为了避免与其他应用程序的通用端口冲突

       返回目录 疯狂Java讲义

       编辑推荐

       Java程序性能优化 让你的Java程序更快 更稳定

       新手学Java 编程

lishixinzhi/Article/program/Java/hx/201311/27266

该服务器完成将客户端发送的内容转换成大写,并发送到客户端(注意:服务器只支持一个客户端连接,后面我们会使用多进程,多线程,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

}

TCP指的是传输控制协议。它是一种面向连接导向的、可靠地及基于字节流的运输层通信协议。而在接触TCP中还有UDP,UDP也是一项重要的传输协议。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端

1、提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输;

2、面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,就像打电话。

3、TCP支持的应用协议:FTP 文件传送、RLogin 远程登录、SMTP POP3 电子邮件、NFS 网络文件系统、远程打印、远程执行、名字服务器终端服务器等服务类型。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存