java下的socket通信与C/C++下的socket通信

本文探讨了JAVA和C/C++中实现Socket通信的关键点。在JAVA下,通过Socket获取输入输出流,使用BufferedReader和PrintWriter进行数据交换;而在C/C++环境中,也涉及到类似的Socket操作。


JAVA下的socket通信:

关键点:

由Socket对象得到输入流(即由另一方发过来的数据),此时构造BufferedReader对象

由Socket对象得到输出流(即发往另一方的数据),此时构造PrintWriter对象

客户端:

public class Client {  
    public static void main(String[] args) throws Exception {  
        //向本机的5469端口发出客户请求  
        Socket socket=new Socket(InetAddress.getLocalHost(),5469);  
        //由Socket对象得到输入流,并构造相应的BufferedReader对象  
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
        //由Socket对象得到输出流,并构造PrintWriter对象  
        PrintWriter os=new PrintWriter(socket.getOutputStream());  
        //由系统标准输入设备构造BufferedReader对象  
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
        while(true){  
            String str=sin.readLine();//从系统标准输入读入一字符串  
            os.println(str);  
            os.flush(); //刷新输出流,使Server马上收到该字符串  
              
            String s=is.readLine();  
            System.out.println("Server : "+s);//在标准输出上打印从Server读入的字符串  
            if(str.equals("end")){  
                break;  
            }  
        }  
        is.close();//关闭Socket输入流  
        os.close();//关闭Socket输出流  
        socket.close();//关闭Socket  
    }  
}  
服务器端:

public class MyServer {  
    public static void main(String[] args) throws Exception{  
        ServerSocket server=new ServerSocket(5469);//创建一个ServerSocket在端口5469监听客户请求  
        Socket client=server.accept();//使用accept()阻塞等待客户请求  
        BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));  
        PrintWriter os=new PrintWriter(client.getOutputStream());  
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
        while(true){  
            String str=is.readLine();  
            System.out.println("Client : "+str);//在标准输出上打印从Client读入的字符串  
              
            os.println(sin.readLine());  
            os.flush();//刷新输出流,使Client马上收到该字符串  
            if(str.equals("end")){  
                break;  
            }  
        }  
        is.close();  
        os.close();  
        client.close();  
        server.close();  
    }  
}  

C/C++下的Socket通信

客户端:
#include <winsock2.h>
#include <iostream>
using namespace std;

int main()
{
	WSADATA wsaData;
	SOCKET client;
	SOCKADDR_IN addr;
	char buf[128];

	if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
	{
		cout<<"初始化 winsock dll 失败"<<endl;
		return -1;
	}

	client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	cout<<"服务器 IP:";
	cin>>buf;

	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr(buf);
	addr.sin_port = htons(9876);

	if(connect(client, (SOCKADDR *)&addr, sizeof(addr))== SOCKET_ERROR)
	{
		cout<<"连接错误";
		int i;
		cin>>i;
		WSACleanup();
		return -1;
	}

	while(1)
	{
		cout<<"message:";
		cin>>buf;
		send(client, buf, strlen(buf)+1, 0);
		if(strcmp(buf, "quit") == 0) break;
		recv(client, buf, sizeof(buf),0);
		cout<<"s:"<<buf<<endl;
	}
	closesocket(client);
	WSACleanup();
		return 0;
}
服务器端:
#include "stdio.h"
#include "winsock2.h"
#include <iostream>
#include <fstream>
using namespace std;

#define mode 1
#define test 0
int main()
{
	WSADATA wsaData;
	SOCKET server,accsock;
	SOCKADDR_IN addr,addr_out;

	if(WSAStartup(0x202,&wsaData)!=0)
	{
		cout<<"初始化错误"<<endl;
		return -1;
	}
	server = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(9876);

	bind(server,(SOCKADDR *)&addr,sizeof(addr));

	char buf[255];

	listen(server,1);

	cout<<"server is listening..."<<endl;

	int len = sizeof(SOCKADDR);
	accsock = accept(server,(SOCKADDR *)&addr_out,&len);
	char *ip;
	int port;
	ip = inet_ntoa(addr_out.sin_addr);
	port = htons(addr_out.sin_port);

	cout<<"server accept client ip:"<<ip<<",port:"<<port<<endl;

	while(1)
	{

		recv(accsock,buf,strlen(buf),0);
		if(buf == 'quit')
			break;
	}
	closesocket(accsock);
	closesocket(server);
	WSACleanup();
	return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值