c++代码:
#pragma comment(lib,"ws2_32.lib")
#include<WinSock2.h>
#include<stdio.h>
void main(){
WORD wVersionRequested;//高位字节指定所需要的Winsock库的副本,低位字节则是主版本
WSADATA wsaData;//包含库版本有关信息的结构体
int err;
wVersionRequested = MAKEWORD(1,1);//使用这个函数方便的获得wVersionRequested值,x高位字节,y低位字节
//加载套接字库,确定要使用套接字库的版本
err = WSAStartup(wVersionRequested,&wsaData);//wVersionRequested:该参数用于指定准备加载的Winsock库的版本,wsaData:指向WSADATA的结构体指针
if(0!=err)return;
if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
WSACleanup();//如果返回的版本与设定的版本不同,终止对Winsock库的使用
return;
}
/**创建一个套接字(相当于java中的Socket),第一个参数指定地址族,对于TCP/IP协议的套接字,它只能是AF_INET/PF_INET
第二个参数指定Socket类型,对于1.1版本的Socket,只支持两种类型的套接字,SOCK_STREAM指定产生流式的套接字(TCP)
SOCK_DGRAM产生数据包(UDP)套接字。第三个参数是特定的地址家族相关的协议,如果指定为0,那么他就会根据地址格式与套接字类别
自动选择一个合适的协议(推荐)
*/
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;//创建一个与套接字地址有关的对象(该结构体存放了与本地地址信息)
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//指定为INADDR_ANY允许套接字想任何分配给本地机器的IP地址发送火接收数据
addrSrv.sin_family = AF_INET;//地址家族,必须设置为AF_INET
addrSrv.sin_port = htons(6000);//指定端口
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//在本地地址上关联一个套接字接口
listen(sockSrv,5);//在该端口上监听
SOCKADDR_IN addrClient;//客户端的套接字
int len = sizeof(SOCKADDR);
char sendBuf[100];//消息缓存区
char recvBuf[100];
char tempBuf[100];
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//得到客服端的连接
printf("%s\n","有客服端连接上来啦");
sprintf(sendBuf,"Welcome %s to chat",inet_ntoa(addrClient.sin_addr));//把字符串写到消息缓存区
//send(sockConn,sendBuf,strlen(sendBuf)+1,0);//把消息发送给客户端
sendto(sockConn,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
while(1){
//接收消息
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
if((recvBuf[0]=='q')&&(recvBuf[1]=='u')&&(recvBuf[2]=='i')&&(recvBuf[3]=='t'))
{
printf("%s\n","Chat end!");
break;
}
printf("%s\n",recvBuf);
printf("%s\n","Please input data:");
gets(sendBuf);
//send(sockConn,sendBuf,strlen(sendBuf)+1,0);//把消息发送给客户端
sendto(sockConn,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
//WSACleanup();
}
closesocket(sockConn);
}
java代码:
package com.c.client;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class CClient {
private Socket s = null;
private InputStream ins = null;
private OutputStream ous = null;
private BufferedReader br = null;
private byte[] buf = new byte[1024];
private String msg = null;
public void start() throws Exception {
s = new Socket("127.0.0.1", 6000);
ins = s.getInputStream();
ous = s.getOutputStream();
while (true) {
int i = 0, j = 0;
for (j = 0; (i = ins.read()) != -1; j++) {
if (i == '\0')
break;
buf[j] = (byte) i;
}
msg = new String(buf, 0, j);
if(msg.startsWith("quit")){
ous.write("quit\0".getBytes());
break;
}
System.out.println(msg);
br = new BufferedReader(new InputStreamReader(System.in));
ous.write((br.readLine() + '\0').getBytes());
}
br.close();
ous.close();
ins.close();
}
public static void main(String arg[]) {
try {
new CClient().start();
} catch (Exception e) {
e.printStackTrace();
}
}
}