TCP-API

服务器

1、创建socket文件描述符,使用socket函数(协议类型IPv4或者IPv6)

 int socket(int domain, int type,int protocol)

      该函数返回一个socket文件描述符 Domain: 协议域常用的有AF_INET(IPv4)、AF_INET6(IPv6)、AF_LOCAL(或称AF_UNIX)、AF_ROUTE等;指定在通信中使用的通信地址。例如AF_INET 则需要使用IPv4地址 Type:指定socket的类型,常用的有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。其中SOCK_STREM 表示面向连接的稳定数据传输即TCP协议。 Protocol:指定协议类型;

2、为socket绑定IP地址和端口

  int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)

  函数执行成功返回0,执行失败返回SOCKET_ERROR

Sockefd :socket 描述符,使用socket函数创建

Addr:指向要绑定的sockfd的协议地址

IPv4结构

struct sockaddr_in{

    sa_family_t sin_family;

    in_port_t sin_port;

    struct in_addr sin_addr;

   char sin_zero[8];

};

 struct in_addr{ uint32_t s_addr; };

IPv6结构如下:

struct sockaddr_in6{

    sa_family_t sin6_family;

    in_port_t sin6_port;

    struct in6_addr sin6_addr;

    char   sin_zero[8];

    uint32_t sin6_scope_id;

};

struct in6_addr{

    unsigned char s6_addr[16];

};

Unix域对应的代码:

#define UNIX_PATH_MAX 108

struct soockaddr_un{

    sa_family_t sun_family;

    char sun_path[UNIX_PATH_MAX];

}

Addrlen: 对应地址的长度

3、监听客户端发来的端口请求

    int listen(int sockfd,int backlog)

    函数执行成功返回0,执行失败返回SOCKET_ERROR

    Sockfd: 要监听的socket描述符

    Backlog: 可以排队的最大连接个数

4、接收来自客户端的请求(服务器被动打开连接,没有客户端连接时服务器会被阻塞)

    int accept(int sockfd, struct sockaddr * addr,socklen_t *addrlen);

   函数调用成功返回一个与客户端连接的socket文件描述符,用来实现客户端与服务器的通信,无客户端时则会一直阻塞

   Sockfd: 服务器的socket文件描述符

  Addr: 用来储存与服务器连接的客户端的地址

  Addrlen: 用来接收客户端地址的长度

5、从socket中取数据或写入数据

网络I/O操作有下面机组

Read()/write()

Recv()/send()

Readv()/writev()

Recvmsg()/sendmsg()

Recvfrom()/sendto()

读:

ssize_t read(int fd,void *buf,size_t count);

从文件描述符fd中读取数据读取成功时,read()返回实际所读的字节数。返回的值为0表示已经读到文件结束,小于0表示出现错误,如果错误是EINTR表明读是由中断引起的,如果错误是ECONNREST表明网络连接出了文件

Fd: socket 文件描述符

Buf: 用来储存数据的缓冲区

Count : 缓冲区的长度

写:

ssize_t write(int fd,const void *buf,size_t nbytes);

将buf中的nbytes字节内容写入到文件描述符fd中,写入成功返回写入的字节数,失败则返回-1,并设置errno变量。向socket描述符中写入时有两种可能:1.write的返回值大于0 表示写入部分或者全部;2.返回值小于0表示写入失败,根据errno错误类型进行错误处理

Fd: socket 文件描述符

Buf: 写入数据的缓冲区

Count : 缓冲区的长度

6、关闭socket(客户端先关闭连接)

#include <unistd.h>

int close(int fd);

关闭一个socket描述符,并立即返回到调用进程,改描述符不能再进行read 或者 write

 

客户端

1、创建socket同服务器创建socket一样

2、连接指定的服务器和端口

      int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

      函数执行成功返回0,执行失败返回SOCKET_ERROR

      Sockfd:要连接的socket描述符

      Addr: 服务器的地址

       Addrlen: 对应的服务器地址的长度

3、向socket中写入数据或者读取数据,同服务器读写一样

4、关闭socket同服务器关闭一样;

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat 7 提供了 WebSocket API,使您能够使用 WebSocket 通信。WebSocket 是一种基于 TCP 协议的协议,可以在客户端和服务器之间进行全双工通信。 在 Tomcat 7 中,您可以使用 javax.websocket 包中的类来创建 WebSocket 应用程序。要创建一个 WebSocket 应用程序,您需要执行以下步骤: 1. 创建一个类并实现 javax.websocket.Endpoint 接口。 2. 实现 onOpen、onMessage、onClose 和 onError 方法。 3. 在 web.xml 文件中添加一个 Servlet,并将其映射到您的 WebSocket 应用程序的路径。 4. 在您的 HTML 页面中使用 JavaScript 来连接 WebSocket。 以下是一个简单的 Tomcat 7 WebSocket 应用程序示例: ``` package com.example.websocket; import javax.websocket.Endpoint; import javax.websocket.EndpointConfig; import javax.websocket.MessageHandler; import javax.websocket.Session; public class MyEndpoint extends Endpoint { @Override public void onOpen(Session session, EndpointConfig config) { session.addMessageHandler(new MessageHandler.Whole<String>() { @Override public void onMessage(String message) { try { session.getBasicRemote().sendText("Received: " + message); } catch (Exception e) { e.printStackTrace(); } } }); } @Override public void onClose(Session session, EndpointConfig config) { System.out.println("Closed"); } @Override public void onError(Session session, Throwable throwable) { System.out.println("Error"); } } ``` 在 web.xml 文件中添加以下代码: ``` <servlet> <servlet-name>MyWebSocketServlet</servlet-name> <servlet-class>org.apache.tomcat.websocket.server.WsWebSocketServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyWebSocketServlet</servlet-name> <url-pattern>/websocket/*</url-pattern> </servlet-mapping> ``` 在您的 HTML 页面中,您可以使用以下 JavaScript 代码来连接 WebSocket: ``` var socket = new WebSocket("ws://localhost:8080/yourappname/websocket"); socket.onopen = function() { console.log("Connected"); }; socket.onmessage = function(event) { console.log("Received: " + event.data); }; socket.onclose = function() { console.log("Closed"); }; socket.onerror = function() { console.log("Error"); }; socket.send("Hello, World!"); ``` 这是一个非常简单的示例,您可以根据您的需求进行更改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值