TCP客户端与服务端之间的通信

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jamie_byr/article/details/79829343
  • 客户端
package cn.itcast.net.p4.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo2 {
	/**
	 * 
	 * @param args
	 * @throws IOException
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException, IOException {
		//客户端法发数据到服务端
		
		/*
		 * Tcp传输,客户端建立的过程。
		 * 1,创建tcp客户端的socket服务。使用的是Socket对象。
		 * 		建议该对象一创建就明确目的地。要连接的主机。
		 * 2,如果连接建立成功,说明数据传输通道已经建立。
		 * 		该通道就是socket流,是底层建立好的。既然是流,说明这里既有输入又有输出。
		 * 		想要输入或者输出流对象,可以找到Socket来获取。
		 * 		可以通过getOutputStream(),和getInputStream()来获取两个字节流。
		 * 3,使用输出流,将数据写出。
		 * 4,关闭资源。
		 */
		
		Socket socket = new Socket("10.108.194.77", 10003);
		
		OutputStream out = socket.getOutputStream();
		
		out.write("tcp演示:哥们又来了!".getBytes());
		
		//读取服务端返回的数据,使用socket读取流。
		InputStream in = socket.getInputStream();
		byte[] buf = new byte[1024];
		
		int len = in.read(buf);
		String text = new String(buf, 0, len);
		System.out.println(text);
		
		//关闭资源。
		socket.close();

	}

}

  • 服务端
package cn.itcast.net.p4.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo2 {
	/**
	 * 
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//服务端接收客户端发送过来的数据,并打印在控制台上。
		
		/*
		 * 建立tcp服务端思路:
		 * 1,创建服务端socket服务。通过ServerSocket对象。
		 * 2,服务端必须对外提供一个端口,否认客户端无法连接。
		 * 3,获取连接过来的客户端对象。
		 * 4,通过客户端对象获取socket流读取客户端发来的数据
		 * 		并打印在控制台上。
		 * 5,关闭资源。关客户端,关服务器。客户端和服务器都要关闭,关闭客户端的原因是服务器得占主导权。
		 */
		
		//1,创建服务端对象。
		ServerSocket ss = new ServerSocket(10003);
		
		//2,获取连接过来的客户端。
		Socket s = ss.accept();//阻塞式的
		String ip = s.getInetAddress().getHostAddress();
		//3,通过socket对象获取输入流,要读取客户端发来的数据。
		
		InputStream in = s.getInputStream();
		
		byte[] buf = new byte[1024];
		
		int len = in.read(buf);//in.read(buf)将in中的数据写入到buf中,并返回数据的长度。
		String text = new String(buf, 0, len);
		
		System.out.println(ip + ":" + text);
		
		//使用客户端socket对象的输出流给客户端返回数据。
		OutputStream out = s.getOutputStream();
		
		out.write("收到".getBytes());
        	//关闭资源。
		s.close();
		ss.close();//一般服务器不关闭,因为要一直提供服务。	
	}	
}

展开阅读全文

QT TCP客户端服务端通信问题

11-03

最近在做一个程序,分客户端、服务端,其间通过TCPScoket进行通信。rn在客户端有一个登录界面,我想把登录信息传递给服务端,然后服务端验证登录者的身份,然后返回一个信息。rn服务端相关代码rnchar buffer_info[1024]=0;rn client->read(buffer_info,client->bytesAvailable());rn QString buffer=QString(buffer_info);rn if(buffer.section(',',0,0)=="0")rn rn this->ID=buffer.section(',',1,1);rn query.prepare("SELECT * FROM db_candidates WHERE ID=? ");//从数据库中查找是否存在该用户IDrn query.bindValue(0,ID.toInt());rn if(query.exec())rn rn QByteArray message;rn message.append("1");//如果存在返回消息“1”rn client->write(message.data());rn qDebug() <<"success";rn rn elsern ;rn rnrnrn客户端相关代码rnthis->Name=ui->lineEdit->text();rn this->ID=ui->lineEdit_2->text();rn this->info=QString("0,").append(this->ID);//将ID等数据传递给info进而通过client传递给服务端rn client.connectToHost("127.0.0.1",5678);//发送ID到服务端rn char buffer_info[1024]=0;//开始准备接收服务端回馈的消息rn client.read(buffer_info,client.bytesAvailable());rn QString buffer=QString(buffer_info);rn qDebug()<<"success";rn if(buffer.toInt()==1)//通信成功rn rn infoToServer.show();rn this->~candidateLogin();rn //client.~Client();rn rn else//通信不成功rn rn ui->label_5->setVisible(false);rn ui->label_6->setVisible(true);rn rnrnrnrnrn纠结了很长时间了 高手多多指点哦。我是菜鸟。 论坛

求助:TCP通信客户端服务端收发消息

07-27

各位大神:rn 本人正在学习JAVA SE中的TCP通信知识—客户端与服务端收发消息,实现的功能是服务端收到客户端的消息后将收到的信息返回给客户端。现服务端能收到客户端消息,但客户端收不到服务端消息,望指点。rn 代码如下:rn 1.客户端:rnpackage chat;rnrnimport java.io.BufferedReader;rnimport java.io.InputStream;rnimport java.io.InputStreamReader;rnimport java.io.OutputStream;rnimport java.io.OutputStreamWriter;rnimport java.io.PrintWriter;rnimport java.net.Socket;rnimport java.util.Scanner;rnrn/**rn * 客户端java.net.Socket;rn * 封装了TCP协议,Socket基于TCP协议实现网络通信。rn * @author adminrn *rn */rnrnpublic class Client rn rn private Socket socket;rn rn /*rn * 构造方法,初始化客户端rn * 创建客户端Socket连接,有2个参数:rn * 1.服务端地址:通过Ip地址就可以找到服务端的那台计算机rn * 2.服务端端口:通过端口就可以找到服务端那台计算机的服务端的应用程序rn * rn * 实例化Socket的过程就是连接的过程,若远端计算机没有响应就会抛出异常rn * @throws Exceptionrn */rn public Client() throws Exceptionrn System.out.println("正在连接服务器。。");rn socket = new Socket("127.0.0.1",8085);rn System.out.println("服务器已连接上。");rn rn rn rn public void start()rn rn rn try rn OutputStream os = socket.getOutputStream();//获取一个输出流rn OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");rn PrintWriter pw = new PrintWriter(osw,true);rn// pw.println("你好服务端");rn rn ServiceHandler serviceHandler = new ServiceHandler();rn Thread t = new Thread(serviceHandler);rn t.start();rn System.out.println("已启动serviceHandler线程");rn rn Scanner scanner = new Scanner(System.in);rn while(true)rn pw.println(scanner.nextLine()); rn rn catch (Exception e) rn e.printStackTrace();rn rn rn rn rn public static void main(String[] args) rn try rn Client client = new Client();rn client.start(); rn catch (Exception e) rn e.printStackTrace();rn System.out.println("客户端启动失败");rn rn rn rn rn class ServiceHandler implements Runnablern rn public void run()rn try rn InputStream is = socket.getInputStream();rn InputStreamReader isr = new InputStreamReader(is,"UTF-8");rn BufferedReader br = new BufferedReader(isr);rn rn String message = null;rn System.out.println("执行到客户端serviceHandler线程了!");rn while((message=br.readLine())!=null)rn System.out.println("执行到客户端br.readLine");rn System.out.println(message);rn rn catch (Exception e) rn e.printStackTrace();rn rn rn rn rnrnrnrnrn 2、服务端:rnrnpackage chat;rnrnimport java.io.BufferedReader;rnimport java.io.IOException;rnimport java.io.InputStream;rnimport java.io.InputStreamReader;rnimport java.io.OutputStream;rnimport java.io.OutputStreamWriter;rnimport java.io.PrintWriter;rnimport java.net.InetAddress;rnimport java.net.ServerSocket;rnimport java.net.Socket;rnrn/**rn * 服务器端serverSocket,有2个任务:rn * 1.向系统申请端口rn * 2.监听端口rn * @author adminrn *rn */rnrnpublic class Service rn rn private ServerSocket server;rn private String post;rn rn public Service() throws Exceptionrn rn /*rn * 初始化的同时申请端口rn */rn server = new ServerSocket(8085);rn InetAddress address = server.getInetAddress();rn post = address.getHostAddress();rn rn rn rn rnrn public void start()rn try rn /**rn * 监听窗口rn * ServerSocket的accept方法是一个阻塞方法,作用是监听服务器端窗口rn * 直到一个客户端连接并创建一个Socket.rn * 使用该Socket即可与刚连接的客户端进行交互。rn * rn * rn */rn while(true)rn System.out.println("等待客户端连接");rn Socket socket = server.accept();rn System.out.println("客户端已连接上");rn rn ClientHandler clientHandler = new ClientHandler(socket);rn Thread t = new Thread(clientHandler);rn t.start();rn rn catch (Exception e) rn e.printStackTrace();rn rn rn rn public static void main(String[] args) rn try rn Service service = new Service();rn service.start();rn catch (Exception e) rn e.printStackTrace();rn System.out.println("服务器启动不成功");rn rn rn rn class ClientHandler implements Runnablern private Socket socket;rn rn public ClientHandler(Socket socket)rn this.socket = socket;rn rn rn public void run()rn try rn System.out.println(post+"上线了!");rn InputStream is = socket.getInputStream();//获取一个输入流rn InputStreamReader isr = new InputStreamReader(is,"UTF-8");rn BufferedReader br = new BufferedReader(isr);rn rn OutputStream os = socket.getOutputStream();rn OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");rn PrintWriter pw = new PrintWriter(osw);rn System.out.println("执行到服务端输出流");rn rn// String message = br.readLine();rn// System.out.println("客户端说:"+message);rn rn String message = null;rn while((message = br.readLine())!=null) rn// System.out.println(post+"说:"+message);rn System.out.println("执行到服务端br.readLine()");rn pw.println(message);rn System.out.println("pw.println执行完毕");rn rn rn catch (Exception e) rn e.printStackTrace();rn finally rn System.out.println(post+"下线了!");rn try rn socket.close();rn catch (IOException e) rn e.printStackTrace();rn rn rn rn rn rnrn 论坛

求助.C#客户端服务端之间通信乱码

05-22

C# 利用结构体服务端和客户端之间交互.中文部分客户端发送出去正常.到服务端接收之后解析出来是乱码.但是在把解析出来的乱码返回给客户端.客户单接收后又正常.请各位高手给予帮助解答.所有脚本都是utf8格式rn以下为结构体代码 服务端和客户端都一样rnrn[code=C#]rnnamespace GameDatarnrn [StructLayout(LayoutKind.Sequential, Pack = 1,CharSet = CharSet.Unicode), Serializable]rn rn public struct Loginmsgrn rn public byte datatypes;rn [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]rn public string userid;rn rnrnrnrn客户端发送部分代码rnrnrnrnif(message[0]==1)rn rn Loginmsg msg=new Loginmsg();rn msg.datatype=1;rn msg.userid="我爱你";rn byte[] bytes=Tool.StructToBytes(msg);rn BinaryWriter bw = new BinaryWriter(networkStream);rn short count = (short)bytes.Length;rn bw.Write(count);rn bw.Write(bytes);rn bw.Flush();rnrnrn服务端接收部分代码rnrn if (receiveMessage[0] == 1)rn rn Loginmsg ms = new Loginmsg();rn ms = (Loginmsg)Tool.BytesToStruct(receiveMessage, ms.GetType());rn Console.WriteLine(ms.userid);rn rnrnrnrnTool工具代码rnrnusing System;rnusing System.Collections.Generic;rnusing System.IO;rnusing System.Runtime.InteropServices;rnrnnamespace GameDatarnrn public class Toolrn rn public static byte[] StructToBytes(object obj)rn rn int size = Marshal.SizeOf(obj);rn byte[] bytes = new byte[size];rn IntPtr structPtr = Marshal.AllocHGlobal(size); //分配结构体大小的内存空间rn Marshal.StructureToPtr(obj, structPtr, false); //将结构体拷到分配好的内存空间rn Marshal.Copy(structPtr, bytes, 0, size); //从内存空间拷到byte数组rn Marshal.FreeHGlobal(structPtr); //释放内存空间rn return bytes;rn rnrn public static object BytesToStruct(byte[] bytes, Type type)rn rn int size = Marshal.SizeOf(type);rn if (size > bytes.Length)rn return null;rn IntPtr structPtr = Marshal.AllocHGlobal(size); //分配结构大小的内存空间rn Marshal.Copy(bytes, 0, structPtr, size); //将byte数组拷到分配好的内存空间rn object obj = Marshal.PtrToStructure(structPtr, type);rn Marshal.FreeHGlobal(structPtr);rn return obj;rn rn rnrnrn[/code]rn 论坛

没有更多推荐了,返回首页