工作中遇到问题,需要用vc的winsocket做服务器端程序,Java做客户端,通过socket向服务器端传送数据,socket编程我懂些,不要说教,请高手给个类似“hello world”的例子,要求是能够客户端不断输入,然后服务器端不断响应的例子。(因为我写的程序只能进行一次通信,然后后边就出问题了)
解决方案 »
- JAVA 控制台创建GUI程序如何设置窗体背景?
- String str = true+"" ;与String str="true";的区别
- tableViewer多个问题,求解决方法
- 怎样测试文件关闭的时候发生IOException错误
- 看什么书可以提高性能和事务处理方面的知识?
- 打开网页的时候,IE总是提示"为帮助保护您的安全, Internet Explorer已经限制此文件显示可能访问您的计算机的活动内容.请击此处查看选项"
- 一个关于保存JComponent图像内容的问题
- 关于DefaultTableModel的问题
- 请问网上的电子地图使用什么方法实现的?(如263的)请各位告知!非常急!!
- 如何将可运行的jar放到环境变量中,让它能在任何目录下运行
- swing子窗口
- BufferedInputStream里面的mark方法中的参数代表什么意思?
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET sSerSock;
SOCKET sAccSock;
sockaddr_in serAddr;
sockaddr_in acc_sin;
int acc_sin_len;
int recv_len;
char szMsg[ MY_MSG_LENGTH ]; if(::WSAStartup(0x0101, &wsaData) != 0)
{
::fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
::ExitProcess(STATUS_FAILED);
} if ((sSerSock = ::socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
::fprintf(stderr,"Socket() failed: %d\n",WSAGetLastError());
::ExitProcess(STATUS_FAILED);
} ::printf("//**************************************************//\n");
::printf(" 服务器端程序 \n");
::printf("//**************************************************//\n"); serAddr.sin_family = AF_INET;
serAddr.sin_port = ::htons(2194);
serAddr.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);
printf("初始化套接字绑定\n");
if (bind(sSerSock, (LPSOCKADDR)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
::fprintf(stderr,"bind(sock) failed: %d\n", ::WSAGetLastError());
::ExitProcess(STATUS_FAILED);
}
printf("套接字绑定结束。\n");
printf("初始化监听\n");
if (::listen(sSerSock, MAX_PENDING_CONNECTS) != 0)
{
::fprintf(stderr, "listen(sock) failed: %d\n",::WSAGetLastError());
::ExitProcess(STATUS_FAILED);
}
printf("初始化监听结束。\n");
printf("监听进行中\n"); acc_sin_len = sizeof(acc_sin);
printf("初始化接收套接字\n");
sAccSock = accept(sSerSock, (struct sockaddr*)&acc_sin, &acc_sin_len);
printf("接收套接字开始接收数据。\n"); if (sAccSock < 0)
{
::fprintf(stderr, "accept(sock) failed: %d\n", WSAGetLastError());
::ExitProcess(STATUS_FAILED);
} while (1)
{
recv_len = recv ( sAccSock, szMsg, MY_MSG_LENGTH, NO_FLAGS_SET );
if (recv_len == SOCKET_ERROR)
{
fprintf(stderr, "没有客户端接入。\n");
fprintf(stderr, "Error %d \n", WSAGetLastError() );
}
else
{
szMsg[recv_len] = '\0'; /* recv_len 为接收数据的真是长度,此语句去除多于的无效字符。(在末尾加入字符串结束符号'\0')*/
fprintf(stderr, "%s\n", szMsg);
} if (recv_len == 0)
{
printf("本次接收的没有数据,是响应客户端连接信息!\n");
}
else
{
printf("本次数据接收结束。\n");
}
if (send(sAccSock, strch, ::strlen(strch),0) == SOCKET_ERROR)
{
fprintf(stderr, "WSAGetLastError: %d\n", WSAGetLastError());
}
printf("\n");
//Sleep(1000); } closesocket(sAccSock);
closesocket(sSerSock);
::WSACleanup();
return 0;
}客户端:public class TalkClient {
public static void main(String args[]) {
try {
Socket socket = new Socket("127.0.0.1", 2194);
// 向本机的4700端口发出客户请求
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
// 由系统标准输入设备构造BufferedReader对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
// 由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
String readline;
readline = sin.readLine(); // 从系统标准输入读入一字符串
while (!readline.equals("bye")) {
// 若从标准输入读入的字符串为 "bye"则停止循环
os.println(readline);
// 将从系统标准输入读入的字符串输出到Server
os.flush();
// 刷新输出流,使Server马上收到该字符串
System.out.println("Client:" + readline);
// 在系统标准输出上打印读入的字符串
System.out.println("Server:" + is.readLine());
// 从Server读入一字符串,并打印到标准输出上
readline = sin.readLine(); // 从系统标准输入读入一字符串
} // 继续循环
os.close(); // 关闭Socket输出流
is.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
} catch (Exception e) {
e.printStackTrace(); // 出错,则打印出错信息
}
}
}
运行结果:第一次通信正常,接下来就不能正常的通信了。