c++ socket 如何将一个对象发送给客户端?

客户 0 23

c++ socket 如何将一个对象发送给客户端?,第1张

c++ socket 如何将一个对象发送给客户端
导读:可以传递结构体,比如:struct A{ int a; int b;};struct A a;send(s,(char)&a,sizeof(a),0);另一方接收到数据到buffer后,如buffer的字节长度为buufersize,则st

可以传递结构体,比如:

struct A

{

int a;

int b;

};

struct A a;

send(s,(char)&a,sizeof(a),0);

另一方接收到数据到buffer后,如buffer的字节长度为buufersize,则

struct b;

memcpy(&b, buffer, buffersize);

就传过去了。

ServerSocket ss = new ServerSocket();

Socket s = ssaccept();

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgetOutputStream()));

bwwrite("hello!");

首先建议使用一个线程向所有客户端发送消息;

在写一个方法发送消息, 方法里面需要 消息和socket 参数;

Thread tSend= new Thread(SendAll);

private void SendAll()

{

//遍历所有的Socket,调用Send(string msg,Socket socket)方法

//不知道你的Socket放到哪里,如果放到集合就遍历集合挨个调用

}

private void Send(string msg,Socket socket)

{

byte[] buffer = EncodingDefaultGetBytes(msg);

socketSend(buffer);

}

MyClient中的

String w = inreadLine();

这一句,调到

Systemoutprintln(w);前

就可以了。

你的想法是向SERVER发一个消息,SERVER回一个消息。

但你的CLIENT还没有发消息,你就开始接收,自然接收不到消息,程序就挂在那了。

发送:

private void button2_Click(object sender, EventArgs e)

{

if (sConnected == true)

{

try

{

string abc = textBox3Text;

sSend(EncodingASCIIGetBytes(abc));

MessageBoxShow("向服务器发送:" + abc);

}

catch

{

MessageBoxShow("发送失败");

}

}

}

接收:

SystemTimersTimer aTimer = new SystemTimersTimer();

byte[] res = new byte[1024];

private void Form1_Load(object sender, EventArgs e)

{

ControlCheckForIllegalCrossThreadCalls = false;

aTimerEnabled = false;

Thread thread1 = new Thread(TimerMange);

thread1IsBackground = true;

thread1Start();

}

void TimerMange()

{

aTimerElapsed += new ElapsedEventHandler(socket_rev);    //定时事件的方法

aTimerInterval = 100; 

}

private void socket_rev(object sender, EventArgs e)

{

int receiveLength = sReceive(res, resLength, SocketFlagsNone);

if (receiveLength > 0)

{

textBox4Text = EncodingASCIIGetString(res, 0, receiveLength);

string abc = "HaveReceive";

sSend(EncodingASCIIGetBytes(abc));

}

}

扩展资料:

C#Socket异步通讯学习

思路

1、Socket分为面向连接协议(如TCP)和无连接协议(如UDP)

2、Socket通信分为同步操作模式和异步操作模式,同步模式在建立连接之前/收到消息之前会阻塞当前进程,异步模式不会阻塞当前进程

综合以上两点,考虑到体验,当然是选择异步Socket啦,另外,这里使用的是面向连接的协议,那么实现思路大致如下:

1、创建Socket对象

2、绑定IP和端口

3、侦听连接

4、开始一个异步操作来接收一个接入的连接请求

5、处理接入的请求

6、向客户端发送消息

package Server;

import javaio;

import javanet;

import messageMessageType;

//该线程用于和客服端进行通信,是一个线程类

public class ServerClientComunicationThread extends Thread{

Socket s=null;

ObjectInputStream ois=null;

MessageType mt=null;

ObjectOutputStream oos=null;

public ServerClientComunicationThread(Socket s){

thiss=s;

}

public void run(){

//不停地从socket里面读取数据

while(true){

try {

ois=new ObjectInputStream(sgetInputStream());

mt=(MessageType)oisreadObject();

Systemoutprintln("服务器读取到的信息");

Systemoutprintln(mtgetContent()+" "+mtgetGetter()+" "+

mtgetMessagetype()+mtgetSendTime());

//将读取到的数据转发给对应的客服端

Systemoutprintln("从集合里面可以找到用户压迫将数据发送给"+ ManageOnlineUserhmget(mtgetGetter()));

oos=new ObjectOutputStream(( ManageOnlineUserhmget(mtgetGetter()))getOutputStream());

ooswriteObject(mt);

} catch (Exception e) {

eprintStackTrace();

}

}

}

}

public class TCPlient {

public static void main(String[] args) {

String str = null;

Socket clientSocket; // 创建客户端套接字

DataInputStream in = null; // 创建DataInputStream对象

DataOutputStream out = null; // 创建DataOutputStream对象

try {

clientSocket = new Socket("127001", 4331); // 实例化Socket对象

//clientSocket = new Socket("192168152139", 6379);

in = new DataInputStream(clientSocketgetInputStream()); // 实例化DataInputStream对象

// 实例化DataOutputStream对象

out = new DataOutputStream(clientSocketgetOutputStream());

outwriteUTF("你好!!"); // 写数据

while (true) {

str = inreadUTF(); // 读取流中数据

outwriteUTF(((int) (Mathrandom() 10) + 1) + ""); // 向流中写入0到10之间的随机数

Systemoutprintln("客户端收到:" + str); // 输出信息

Threadsleep(1000); // 线程休眠

}

} catch (Exception e) {

eprintStackTrace();

}

}

}

public class TCPServer {

public static void main(String[] args) {

ServerSocket serverSocket = null; // 创建服务器端套接字

Socket clientSocket = null; // 创建客户端套接字

String str = null;

DataOutputStream out = null; // 创建DataOutputStream类对象

DataInputStream in = null; // 创建DataInputStream类对象

try {

serverSocket = new ServerSocket(4331); // 实例化ServerSocket对象

clientSocket = serverSocketaccept(); // 接收客户的套接字连接呼叫

in = new DataInputStream(clientSocketgetInputStream()); // 实例化DataInputStream对象

out = new DataOutputStream(clientSocketgetOutputStream()); // 实例化DataOutputStream对象

while (true) {

str = inreadUTF(); // 读取客户放入连接中的信息

outwriteUTF("hello,我是服务器"); // 通过输出流向线路中写信息

outwriteUTF(str);

Systemoutprintln("服务器收到:" + str);

Threadsleep(1000); // 线程休眠

}

} catch (Exception e) {

eprintStackTrace();

}

}

}

//要发到另一个client,就让server转发消息就行。

把XML保存为字符串发送到客户端然后在客户端使用XMLDOCUMENT的Load方法,将字符串加载xmldocumentdoc=newxmldocument();docload(接收过来的字符串);下面你自己处理吧