注:  在客户端游戏开发中,使用HTTP进行网络通信的比较少,一般使用的都是Socket进行通信。而HTTP一般用于网页或者网页游戏。

【Socket简介】

1、套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

套接字: { IP地址 : 端口号 }

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

2、套接字类型  

TCP/IP的socket提供下列三种类型套接字。

2.1、流式套接字(SOCK_STREAM)

提供了一个面向连接(TCP)、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。

2.2、数据报式套接字(SOCK_DGRAM)

提供了一个无连接服务(UDP)。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。

2.3、原始式套接字(SOCK_RAW) 

该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。

3、建立socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

(a)服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

(b)客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

(c)连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

4、典型套接字调用过程举例

TCP/IP协议的应用一般采用客户/服务器模式,因此在实际应用中,必须有客户和服务器两个进程,并且首先启动服务器,其系统调用时序图如下。

面向连接的协议(TCP)的套接字系统调用如下:

> 服务器必须首先启动,直到它执行完accept()调用,进入等待状态后,方能接收客户请求。

> 假如客户在此前启动,则connect()将返回出错代码,连接不成功。

无连接的协议(UDP)的套接字调用如下:

> 无连接服务器也必须先启动,否则客户请求传不到服务进程。

> 无连接客户不调用connect()。因此在数据发送之前,客户与服务器之间尚未建立完全相关,但各自通过socket()和bind()建立了半相关。

> 发送数据时,发送方除指定本地套接字号外,还需指定接收方套接字号,从而在数据收发过程中动态地建立了全相关。

【Socket连接】

使用的是面向连接的TCP套接字系统调用API。

0、将ODSocket源码放在Classes目录下(ODSocket是仿照原生Socket写的一个类似Socket的一个类)

1、客户端

使用ODSocket的API实现与服务端的网络连接。

> 创建ODSocket:ODSocket socket;

> 初始化:Init() 、 Create();

> 设置需要连接的服务器的 IP地址和端口号:ip 、 port;

> 连接服务器:Connet(ip, port);

> 发送数据:Send(string, lenght);

> 接收数据:Recv(string, lenght, 0);

> 关闭连接:Close();

代码如下

// 引入头文件
#include "ODSocket/ODSocket.h"// Socker连接
void HelloWorld::connectServer()
{// 初始化// ODSocket socket;socket.Init();socket.Create(AF_INET, SOCK_STREAM, 0);// 设置服务器的IP地址,端口号// 并连接服务器 Connectconst char* ip = "127.0.0.1";int port = 12345;bool result = socket.Connect(ip, port);// 发送数据 Sendsocket.Send("login", 5);if (result) {CCLOG("connect to server success!");// 开启新线程,在子线程中,接收数据std::thread recvThread = std::thread(&HelloWorld::receiveData, this);recvThread.detach(); // 从主线程分离}else {CCLOG("can not connect to server");return;}
}// 接收数据
void HelloWorld::receiveData()
{// 因为是强联网// 所以可以一直检测服务端是否有数据传来while (true) {// 接收数据 Recvchar data[512] = "";int result = socket.Recv(data, 512, 0);printf("%d", result);// 与服务器的连接断开了if (result <= 0) break;CCLOG("%s", data);}// 关闭连接socket.Close();
}

2、服务端

使用Eclipse开发环境,Java语言,服务端使用的是 ServerSocket 来监听端口。

2.1、Server类

用于创建ServerSocket,监听端口,等待客户连接。

public class Server {public static void main(String[] args) throws IOException {// 创建ServerSocket,监听端口号:12345ServerSocket ss = new ServerSocket(12345);// 创建用于管理客户端的收发数据的子线程类ClientThread clientThread = new ClientThread();clientThread.start();System.out.println("服务器开启啦");// 监听端口号:12345// 等待客户连接 accept()while (true) {// 开始接收客户端的连接Socket socket = ss.accept();System.out.println("有新客户连接~");clientThread.addClient(socket);}}
}

2.2、ClientThread类

用于管理、处理客户端的收发数据请求。

// 继承Thread线程类
public class ClientThread extends Thread {// 客户端连接的socket列表private ArrayList<Socket> clients = new ArrayList<Socket>();// 添加客户public void addClient(Socket socket) {clients.add(socket);}// 删除客户public void removeClient(Socket socket) {clients.remove(socket);}// 向客户发送数据public void sendMessage(Socket socket, String data) throws IOException {// 给玩家发送数据OutputStream os = socket.getOutputStream();os.write(data.getBytes("UTF-8"));}@Overridepublic void run() {while (true) {try {for (Socket socket : clients) {// 获取客户端发来的数据InputStream is = socket.getInputStream();int len = is.available() + 1;byte[] buff = new byte[len];int flag = is.read(buff);// read()返回-1,说明客户端的socket已断开if (flag == -1) {System.out.println("有客户断开连接~");this.removeClient(socket);break;}// 输出接收到的数据String read = new String(buff);System.out.println("收到数据:" + read);// 给玩家发送数据String data = "恭喜你,连接成功啦~~";sendMessage(socket, data);}sleep(10);} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}
}
//

Socket简介及客户端服务器连接实例相关推荐

  1. cf虚拟服务器设置方法,cf客户端 服务器 连接

    cf客户端 服务器 连接 内容精选 换一换 DCS缓存实例支持域名访问后,若客户端无法使用域名连接DCS缓存实例,需要将租户子网的DNS服务地址配置为内网域名服务器地址.具体配置方法请参考修改VPC子 ...

  2. 【Java——网络编程基础之客户端服务器连接】

    网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...

  3. linux下socket编程实现一个服务器连接多个客户端

    使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接. 2)客户端:socker()建立套接字,连接(con ...

  4. Java【网络编程1】使用 UDP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    文章目录 前言 一.认识 Socket(套接字), TCP 协议和 UDP 协议 1, 什么是 Socket(套接字) 2, 浅谈 TCP 协议和 UDP 协议的区别和特点 二.基于 UDP 协议的 ...

  5. wegame与客户端服务器连接中断95,DNF无限网络异常09解决方法 使用wegame游戏进不去连接中断...

    TP读完条后直接就闪退了,然后wegame界面就直接弹出来了,一定要是第二次才能顺利的进入,也有人是在登录后直接是画面弹不出来的那种. 那有些玩家是在登录的时候系统提示什么网络异常09的提示,不管是什 ...

  6. 工贸宝一直连接服务器失败,你好,T1工贸宝多站点客户端服务器连接失败?是什么原因...

    用友通-普及版10.5用友通-普及版10.5 :QQ4009908488 在线咨询>> 从客户实际需求出发,面向成长型企业开发设计,提高管理水平.优化运营流程,实现全面.精细化财务管理与业 ...

  7. WebRTC系列<四> 全面了解客户端-服务器网页游戏的WebRTC

    转载:https://blog.brkho.com/2017/03/15/dive-into-client-server-web-games-webrtc/ 多人游戏很有趣.对于他们在单人沉浸感方面所 ...

  8. 小米电视注册显示访问服务器失败,为什么手机看电视连接上却出现服务器连接异常 – 手机爱问...

    2014-02-04 我就问问手机客户端服务器连接异常是怎么回事.......而且只有一个账号连接异常. 服务器是指管理和传输信息的一种计算机系统. 服务器是一种高性能计算机,作为网络的节点,存储.处 ...

  9. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

最新文章

  1. mysql统计出每个姓氏的人数_你见过什么偏僻的姓氏?明明是老虎的虎姓氏却读māo...
  2. solr5.3.1 集成IK中文分词器
  3. 快速了解 MySQL 的性能优化
  4. network packet
  5. leetcode 563. 二叉树的坡度(Java版)
  6. 期货与期权(part1)--衍生品
  7. java文件流null_JAVA 获取资源文件对象为NULL
  8. mpAndroidchart 坐标和图表距离_【玩转图表系列】六步,美化你的图表,让老板刮目相看!...
  9. 自动化测试工具selenium python_WEB自动化测试工具selenium录制器
  10. 搜狗浏览器数据备份/同步工具
  11. visual studio 2008试用版的评估期29天后结束 解决办法
  12. .NET Framework-多线程网络编程
  13. Java之数组(下)
  14. python变量赋值方式_【Python入门学习】详谈python变量和变量赋值语句
  15. Inceptor导出建表语句、存储过程
  16. Jeecg框架 修改首页
  17. 电路课设-音响分频器电路设计
  18. excel vba 字典使用方法学习
  19. Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。
  20. js URL 地址参数格式化

热门文章

  1. Shell脚本中command not found报错处理
  2. 【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。
  3. .jQuery文档分析4-文档处理
  4. poj1088 滑雪
  5. 携程CEO称成功来自传统营销 B2C已经过时
  6. .NET 框架与多线程 (转载)
  7. CCF-CSP 201703-2 试题名称: 学生排队(满分代码)
  8. 闯荡北京卖枣的临县人:同有一个“红枣美梦”(2张)
  9. 深入理解 __doPostBack
  10. springboot-24-restTemplate的使用