CSocket简单例子服务器与客户端通信优选稿

合集下载

一个简单的Socket通信Demo

一个简单的Socket通信Demo

⼀个简单的Socket通信Demo服务器端Demo:Server.java(服务器端运⾏主程序,直接运⾏):package cn.wjs;import .InetAddress;import .ServerSocket;import .Socket;public class Server {private static final int port = 9999;private static final int backlog = 100;private static final String bindAddr = "127.0.0.1";public static void main(String[] args) throws Exception {System.out.println("正在启动Socket服务器");ServerSocket server = new ServerSocket(9998, 100, InetAddress.getByName("127.0.0.1"));System.out.println("启动完成\n正在监听客户端连接");while (true) {Socket socket = server.accept();System.out.println("产⽣了⼀个新的会话,来⾃:" + socket.getInetAddress() + "\n=================================="); new ServerMessageReceiver(socket).start();new ServerMessageSender(socket).start();System.out.println("服务器端已启动");}}}ServerMessageReceiver.java:package cn.wjs;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .Socket;public class ServerMessageReceiver extends Thread{private Socket socket;public ServerMessageReceiver(Socket socket){this.socket = socket;}public void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8"));String content = null;while (true) {if (this.socket.isClosed()) {System.out.println("Socket已经关闭");reader.close();this.socket.close();break;}content = reader.readLine();if (content.equals("bye")) {System.out.println("对⽅请求关闭连接,⽆法继续进⾏聊天");reader.close();this.socket.close();break;}System.out.println("【对⽅】" + content + "\n");}reader.close();this.socket.close();}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ServerMessageSender.java:package cn.wjs;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .Socket;public class ServerMessageSender extends Thread{private Socket socket;public ServerMessageSender(Socket socket){this.socket = socket;}public void run() {try {BufferedWriter outwriter = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8")); BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));String msg = null;while (true) {msg = inputReader.readLine();if (msg.toLowerCase().equals("exit")) {System.exit(0);}if (this.socket.isClosed()) {System.out.println("Socket已经关闭");outwriter.close();inputReader.close();this.socket.close();break;}outwriter.write(msg);outwriter.newLine();outwriter.flush();}}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ClientDemo:Client.java(客户端主程序,直接运⾏):package cn.wjs;import java.io.IOException;import .InetAddress;import .Socket;import .UnknownHostException;public class Client{private static final int port = 9999;private static final String bindAddr = "127.0.0.1";public static void main(String[] args){System.out.println("正在连接Socket服务器");try {Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9998);System.out.println("已连接\n================");new ClientMessageSender(socket).start();new ClientMessageReceiver(socket).start();System.out.println("已启动");}catch (UnknownHostException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ClientMessageReceiver.java:package cn.wjs;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .Socket;public class ClientMessageReceiver extends Thread{private Socket socket;public ClientMessageReceiver(Socket socket){this.socket = socket;}public void run(){try {BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8")); String content = null;while (true) {if (this.socket.isClosed()) {System.out.println("Socket已经关闭");reader.close();this.socket.close();break;}content = reader.readLine();if (content.equals("bye")) {System.out.println("对⽅请求关闭连接,⽆法继续进⾏聊天");reader.close();this.socket.close();break;}System.out.println("【对⽅】" + content + "\n");}}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ClientMessageSender.java:package cn.wjs;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .Socket;public class ClientMessageSender extends Thread{private Socket socket;public ClientMessageSender(Socket socket){this.socket = socket;}public void run(){try {BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8"));BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String msg = null;while (true) {msg = reader.readLine();if (msg.toLowerCase().equals("exit")) {System.exit(0);}if (this.socket.isClosed()) {System.out.println("Socket已经关闭");writer.close();this.socket.close();break;}writer.write(msg);writer.newLine();writer.flush();}}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}通过elicpse导出jar包直接运⾏,服务器端导出jar设置main.class为Server.java,客户端导出jar设置main.class为Client.java------这是传统的TCP/BIO模式.如果多个客户端向服务器发送请求,通常采⽤连接池的⽅式来维护,这和数据库的连接池⼀个道理。

C#TCPIP通信,Socket通信例子

C#TCPIP通信,Socket通信例子

C#TCPIP通信,Socket通信例⼦1、服务端建⽴监听,等待客户端连接class Program{static void Main(string[] args){TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);Console.WriteLine("1.服务端建⽴监听");listener.Start();Console.WriteLine("等待客户端连接");TcpClient tcpClient = listener.AcceptTcpClient();Console.WriteLine("2.1客户端已经连接");Console.WriteLine("2.2获取到客户端传过来报⽂流");NetworkStream stream = tcpClient.GetStream();Console.WriteLine("3.初始化⼀个字节数组");byte[] data = new byte[1024];Console.WriteLine("4.从流中读取内容到字节数组");int length = stream.Read(data, 0, 1024);Console.WriteLine("5.将字节数组中的内容解析为字符串");string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine("6.打印");Console.WriteLine(message);Console.WriteLine("7.关闭流");stream.Close();Console.WriteLine("8.停⽌监听者");listener.Stop();Console.WriteLine("9.程序结束");Console.ReadKey();}}2.从主机连接得到客户端class Program{static void Main(string[] args){Console.WriteLine("0.声明⼀个客户端");TcpClient tcpClient = new TcpClient("127.0.0.1", 8000);Console.WriteLine("1.从客户端得到⼀个流");NetworkStream stream = tcpClient.GetStream();Console.WriteLine("2.请输⼊要发送的内容");string message = Console.ReadLine();Console.WriteLine("3.将输⼊的字符串解析为字节数组");byte[] data = Encoding.UTF8.GetBytes(message);Console.WriteLine("4.将字节内容写⼊流");stream.Write(data, 0, data.Length);Console.WriteLine("5.关闭流");stream.Close();Console.WriteLine("7.关闭客户端");tcpClient.Close();Console.WriteLine("8.程序结束");Console.ReadKey();}}。

socket 常见的使用方式和使用场景

socket 常见的使用方式和使用场景

socket 常见的使用方式和使用场景Socket是一种用于在计算机网络中进行通信的工具。

它提供了一种简单而强大的方式,使得应用程序能够通过网络连接进行数据交换。

在本文中,我们将介绍Socket的常见使用方式和使用场景。

Socket的常见使用方式主要包括客户端和服务器端。

在客户端使用Socket时,我们可以通过创建一个Socket对象来建立与服务器的连接。

通过该连接,客户端可以向服务器发送请求,并接收服务器返回的响应。

而在服务器端使用Socket时,我们可以通过创建一个ServerSocket对象来监听指定的端口,并接受客户端的连接请求。

一旦连接建立成功,服务器端可以与客户端进行双向通信。

Socket的使用场景非常广泛。

下面我们将介绍几个常见的使用场景。

1. 网络通信:Socket是实现网络通信的基础工具之一。

通过Socket,我们可以在不同计算机之间进行数据交换。

例如,我们可以使用Socket在客户端和服务器之间传输数据,实现远程控制、文件传输等功能。

2. 实时通信:Socket可以用于实现实时通信应用,如聊天室、视频会议等。

通过Socket,用户可以实时地发送和接收消息,实现即时通信的需求。

在这种场景下,Socket通常会使用多线程或多进程来处理并发连接和消息处理。

3. 分布式计算:Socket可以用于实现分布式计算系统。

通过Socket,不同计算节点之间可以进行数据交换和协同计算,实现分布式任务的执行。

在这种场景下,Socket通常会使用TCP协议来保证数据的可靠传输。

4. 网络游戏:Socket可以用于实现网络游戏中的实时数据交换。

通过Socket,游戏服务器可以与多个客户端建立连接,并实时地发送和接收游戏数据。

在这种场景下,Socket通常会使用UDP协议来实现低延迟的数据传输。

5. 物联网应用:Socket可以用于实现物联网应用中的设备间通信。

通过Socket,不同的物联网设备可以进行数据交换和共享,实现智能家居、智能工厂等应用。

c++与android通讯

c++与android通讯

今天晚上11点半,在学校断网后的十分钟,我终于实现了C++服务器端与Android客户端的通信。

本来很简单的一件事,却因为Android Socket线程阻塞的问题弄了我两天。

好了不多说,直接进入主题:C++ 服务器端:用C++进行网络编程有很多方式,比如可以使用winSock,winInt,或者使用MFC的封装类CSocket等等。

这里我使用的是比较简单的CSocket类来实现。

这里先简单说说使用CSocket类来建立服务器端的过程:上图是C++服务器端与Android客户端通信的流程图。

看到上面的流程图,C++程序员应该感到高兴,这不就是CSocket客户端的变体嘛。

服务器端完全没变化,这先不说,Android客户端连connet动作都省下来了。

这……是不是写错了?没错,确实连connet这个步骤都省了。

当然,没有connect只不过是因为这个connect 的动作直接被封装到了Android Socket的new操作里而已。

不然,服务器端怎么可能知道你这个狡猾的客户端会不会三更半夜的来敲门,说要提供服务啊。

哈哈。

注:在Android Socket的构造函数中有多种形式,并不是每一种形式都必须在构造时就连接到服务器。

读者可以自己阅读Android的开发文档,你会发现Socket也有个名为Connect的成员函数。

好了,有了基本的操作流程后,写起代码来就容易多了。

观察流程图中C++服务器端的构造过程可以知道,服务器端的构造大致分为三大步骤:1、创建用于侦听的socket套接字sevSock并开启侦听;2、创建用于接收/发送信息的socket套接字reveiceSoc,创建后“绑定”到侦听套接字;3、reveiceSoc套接字接收/发送信息。

这几个步骤对于C++程序员来说已经是滚瓜烂熟了。

我也不多说,直接动手更见效。

(开发环境:VS 2008)第一步:创建一个新MFC应用程序项目,这里名为AndroidSocket,应用程序类型为“基于对话框”就可以了。

C语言网络游戏开发服务器和客户端通信

C语言网络游戏开发服务器和客户端通信

C语言网络游戏开发服务器和客户端通信网络游戏开发在现代已经成为一个非常流行和受欢迎的领域。

在开发网络游戏时,服务器和客户端的通信是一个至关重要的方面。

C语言作为游戏开发的常用编程语言之一,对于服务器和客户端通信的实现也提供了丰富的功能和灵活性。

本文将介绍C语言中网络游戏开发中服务器和客户端通信的基本原理和常用方法。

一、基本原理在网络游戏开发中,服务器和客户端通信是通过基于网络协议的数据传输实现的。

常见的网络协议包括TCP/IP协议和UDP协议。

TCP/IP协议提供可靠的连接,在游戏中适用于需要保证信号传输的场景,如角色移动、战斗等。

UDP协议则提供了快速的数据传输,适用于实时性要求较高的场景,如聊天、广播等。

服务器和客户端之间通信的基本原理是通过建立Socket连接来进行数据传输。

Socket可以理解为服务器和客户端之间的通信接口。

服务器创建Socket并监听指定的端口,等待客户端连接;客户端则根据服务器的IP地址和端口号发起连接请求。

一旦连接建立成功,服务器和客户端就可以通过Socket进行双向数据传输。

二、服务器端通信实现服务器端通信的实现通常包括以下几个步骤:1. 创建Socket:服务器使用socket()函数创建一个Socket对象,并指定使用的协议和端口号。

2. 绑定地址和端口:将服务器的IP地址和端口号与Socket绑定,确保客户端可以连接到正确的地址。

3. 监听连接:使用listen()函数开始监听客户端连接请求。

服务器进入阻塞状态,等待客户端连接。

4. 接受连接请求:使用accept()函数接受客户端连接请求,并返回一个新的Socket对象用于与该客户端进行通信。

5. 数据传输:通过Socket进行数据传输。

服务器可以通过send()函数向客户端发送数据,通过recv()函数接收客户端发送的数据。

6. 关闭连接:通信结束后,服务器使用close()函数关闭Socket,释放资源。

Linux下的CSocket编程--server端的简单示例

Linux下的CSocket编程--server端的简单示例

Linux下的CSocket编程--server端的简单⽰例Linux下的C Socket编程(三)server端的简单⽰例经过前⾯的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的⼀个端⼝上⾯去。

绑定socket到⼀个端⼝上bind()函数可以将socket绑定到⼀个端⼝上,client可以通过向这个端⼝发起请求,端⼝对应的socket便会与client端的socket连接。

#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>int main() {int socket_desc;struct sockaddr_in server;socket_desc = socket(AF_INET, SOCK_STREAM, 0);if (-1 == socket_desc) {perror("cannot create socket");exit(1);}// 监听服务器⾃⾝server.sin_addr.s_addr = INADDR_ANY;server.sin_family = AF_INET;server.sin_port = htons(8888);// 绑定到端⼝if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {perror("cannot bind error");exit(1);}printf("bind success");close(socket_desc);return 0;}对于server.sin_addr.s_addr的更多信息可以参考通过将socket绑定到⼀个确定的端⼝上,我们接下来要做的便是接收这个端⼝下的所有数据。

CAsyncSocket通信示例 - 客户端程序

CAsyncSocket通信示例 - 客户端程序

利用CAsyncSocket类编程–客户端程序一、编程思路:1. 建立工作区(解决方案):CAsyncSocket通信示例2. 为服务器建立工程(项目):TalkS3. 为客户端建立工程(项目):TalkC操作步骤:文件> 新建> 项目> Visual C++ > MFC > MFC应用程序在“名称”后输入:TalkC在“解决方案名称”后输入:CAsyncSocket通信示例如下图所示:单击“确定”按钮出现:单击“下一步”出现下图:把“关于”框前的选项去掉,在“对话框标题”中输入:客户端程序,这样程序运行时的标题栏就会出现“客户端程序”字样单击“下一步”出现下图:可以看出,此时我们建立的工程TalkC有两个类CTalkCApp和CTalkCDlg,前一个是应用程序类,无需干预,后一个是程序的主界面即对话框类,是我们重点关注的对象。

CTalkCDlg的第一个字母C表示这是一个类,中间的TalkC表示工程名称,Dlg表示对话框。

类CTalkCDlg的两个相关文件是TalkCDlg.h和TalkCDlg.cpp.h文件中包含该类的定义(Definition),.cpp文件中包含该类实现(Implementation)单击“完成”显示下图:下一步开始编辑文本框的界面:1. 逐一向界面中添加Static Text(静态文本)控件、Edit(文本框)控件、List(列表框)控件和Button(按钮)控件,结果如下图所示:这个地方时静态文本控件IDC_STATIC_STATUS,因其Caption属性为空,所以暂时看不见特别要注意的是:列表框IDC_LIST_SENT和IDC_LIST_RECEIVED的Sort属性要置为false发送按钮IDC_BUTTON_SEND的Default Button属性要置为true 变成蓝色显示2. 为刚刚创建的控件建立变量:在VC++6.0中可以通过类向导(Class Wizard)添加,在VS2010中手段更多,可直接在控件上单击右键添加控件变量即可,控件和对应的变量如下:本例中我们为Static Text以及Button类控件都定义了对应的变量,这样在形如:GetDlgItem(IDC_STATIC_SNAME)->EnableWindow(true);的代码中即可用:m_editSName.EnableWindow(true);来替代。

socket编程——一个简单的例子

socket编程——一个简单的例子

socket编程——⼀个简单的例⼦1、⽹络中进程之间如何通信?本地的进程间通信(IPC)有很多种⽅式,但可以总结为下⾯4类:消息传递(管道、FIFO、消息队列)同步(互斥量、条件变量、读写锁、⽂件和写记录锁、信号量)共享内存(匿名的和具名的)远程过程调⽤(Solaris门和Sun RPC)但这些都不是本⽂的主题!我们要讨论的是⽹络中进程之间如何通信?⾸要解决的问题是如何唯⼀标识⼀个进程,否则通信⽆从谈起!在本地可以通过进程PID来唯⼀标识⼀个进程,但是在⽹络中这是⾏不通的。

其实TCP/IP协议族已经帮我们解决了这个问题,⽹络层的“ip地址”可以唯⼀标识⽹络中的主机,⽽传输层的“协议+端⼝”可以唯⼀标识主机中的应⽤程序(进程)。

这样利⽤三元组(ip地址,协议,端⼝)就可以标识⽹络的进程了,⽹络中的进程通信就可以利⽤这个标志与其它进程进⾏交互。

使⽤TCP/IP协议的应⽤程序通常采⽤应⽤编程接⼝:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现⽹络进程之间的通信。

就⽬前⽽⾔,⼏乎所有的应⽤程序都是采⽤socket,⽽现在⼜是⽹络时代,⽹络中进程通信是⽆处不在,这就是我为什么说“⼀切皆socket”。

2、什么是Socket?上⾯我们已经知道⽹络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,⽽Unix/Linux基本哲学之⼀就是“⼀切皆⽂件”,都可以⽤“打开open –> 读写write/read –> 关闭close”模式来操作。

我的理解就是Socket就是该模式的⼀个实现,socket即是⼀种特殊的⽂件,⼀些socket函数就是对其进⾏的操作(读/写IO、打开、关闭),这些函数我们在后⾯进⾏介绍。

socket⼀词的起源在组⽹领域的⾸次使⽤是在1970年2⽉12⽇发布的⽂献中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C S o c k e t简单例子服务
器与客户端通信
集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)
这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信。

注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。

在这个例子中,实际上还有很多问题没有解决,如消息边界问题、端口号是否被占用、消息命令的解析问题等。

下面是两个程序的代码,(两个程序均为控制台程序)
注:多个TCP连接或多个进程可能需要通过同一个 TCP协议端口传输数据。

为了区别不同的应用程序进程和连接,许多为应用程序与TCP/IP 协议交互提供了称为套接字(Socket)的接口。

先发服务端的(Server)完整代码如下:
引入命名空间:
;
usingSystem.Threading;
namespaceSocketServer
{
classProgram
{
privatestaticbyte[]result=newbyte[1024]; privatestaticintmyProt=8885;//端口
staticSocketserverSocket;
staticvoidMain(string[]args)
{
//服务器IP地址
serverSocket=newSocket(AddressFamily.InterNetwork,SocketType. Stream,ProtocolType.Tcp);
serverSocket.Bind(newIPEndPoint(ip,myProt));//绑定IP地址:端口
serverSocket.Listen(10);//设定最多10个排队连接请求
);
//通过Clientsoket发送数据
ThreadmyThread=newThread(ListenClientConnect);
myThread.Start();
Console.ReadLine();
}
///<summary>
///监听客户端连接
///</summary> privatestaticvoidListenClientConnect()
{
while(true)
{
SocketclientSocket=serverSocket.Accept(); ThreadreceiveThread=newThread(ReceiveMessage); receiveThread.Start(clientSocket);
}
}
///<summary>
///接收消息
///</summary>
///<paramname="clientSocket"></param> privatestaticvoidReceiveMessage(objectclientSocket) {
SocketmyClientSocket=(Socket)clientSocket;
while(true)
{
try
{
//通过clientSocket接收数据
intreceiveNumber=myClientSocket.Receive(result); Console.WriteLine("接收客户端{0}消息
{1}",myClientSocket.RemoteEndPoint.T
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close();
break;
}
}
}
}
}
以上是服务端(server)的完整代码。

客户端(Client)的完整代码如下:
引入命名空间:
;
using?System.Threading; namespaceSocketClient
{
classProgram
{
privatestaticbyte[]result=newbyte[1024];
staticvoidMain(string[]args)
{
//设定服务器IP地址
SocketclientSocket=newSocket(AddressFamily.InterNetwork,Socke tType.Stream,ProtocolType.Tcp);
try
{
clientSocket.Connect(newIPEndPoint(ip,8885));//配置服务器IP 与端口
Console.WriteLine("连接服务器成功");
}
catch
{
Console.WriteLine("连接服务器失败,请按回车键退出!"); return;
}
//通过clientSocket接收数据
intreceiveLength=clientSocket.Receive(result);
//通过clientSocket发送数据
for(inti=0;i<10;i++)
{
try
{
Thread.Sleep(1000);//等待1秒钟
stringsendMessage="clientsendMessageHellp"+DateTime.Now; Console.WriteLine("向服务器发送消息:{0}"+sendMessage);
}
catch
{
clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close();
break;
}
}
Console.WriteLine("发送完毕,按回车键退出"); Console.ReadLine();
}
}
}
编译成功后,先运行服务端(server),再运行客户端(client)即可达到通信效果。

相关文档
最新文档