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;
}

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

381

被折叠的 条评论
为什么被折叠?



