工作中遇到问题,需要用vc的winsocket做服务器端程序,Java做客户端,通过socket向服务器端传送数据,socket编程我懂些,不要说教,请高手给个类似“hello world”的例子,要求是能够客户端不断输入,然后服务器端不断响应的例子。(因为我写的程序只能进行一次通信,然后后边就出问题了)

解决方案 »

  1.   

    贴上我的程序服务器端:
    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(); // 出错,则打印出错信息
    }
    }
    }
    运行结果:第一次通信正常,接下来就不能正常的通信了。
      

  2.   

    socket编程我懂些,不要说教什么口气嘛,谁还愿意给你说?