2012-01-10 112 views
1

我在java中有c和客戶端中的服務器,但它不起作用。
1.運行服務器,服務器等待客戶端
2,運行客戶端 - 客戶端發送字符串
3.服務器獲取冷杉性格和增加它發送給客戶端//我想到這一點,但
服務器獲取一些錯誤的字符
4.client得到字符並把它寫在屏幕上//想到這一點,但客戶端會失敗,此
例外:
java通信中C客戶端中的TCP服務器

Exception in thread "main" java.net.SocketException: Connection reset 
     at java.net.SocketInputStream.read(SocketInputStream.java:168) 
     at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266) 
     at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279) 
     at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750) 
     at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780) 
     at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 
     at clientTCP.main(clientTCP.java:19) 

5)客戶端應該結束和服務器繼續運行//但是客戶以前後下樓例外

有誰知道哪裏可能是問題?服務器,客戶端使用TCP協議。

服務器:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <sys/un.h> 
#include <unistd.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stdlib.h> 

int main() 
{ 
    int server_sockfd, client_sockfd; 
    int server_len, client_len; 
    struct sockaddr_in server_address; 
    struct sockaddr_in client_address; 


    server_sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    server_address.sin_family = AF_INET; 
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server_address.sin_port = htons(10000); 

    server_len = sizeof(server_address); 

     if(bind(server_sockfd, (struct sockaddr *)&server_address, server_len) != 0) 
     { 
       perror("oops: server-tcp-single"); 
       exit(1); 
     } 

    listen(server_sockfd, 5); 

    signal(SIGCHLD, SIG_IGN); 

    while(1) 
    { 
     char ch; 
     printf("server wait...\n"); 

     client_len = sizeof(client_address); 
     client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len); 

     printf("Client connected \n"); 

     if(fork() == 0) 
     { 
      read(client_sockfd, &ch, 1); 
      printf("Client send = %c\n", ch); 

      ch++; 

      sleep(5); 

      printf("Server send = %c\n", ch); 
      write(client_sockfd, &ch, 1); 
      close(client_sockfd); 
      exit (0); 
     } 
     else 
      close(client_sockfd); 

    } 
} 

客戶端在Java中:

import java.io.*; 
import java.net.*; 

class clientTCP 
{ 
public static void main(String argv[]) throws Exception 
{ 
    String sentence; 
    String modifiedSentence; 
    Socket socket = new Socket("127.0.0.1", 10000); 
    InetAddress adresa = socket.getInetAddress(); //address 
    System.out.print("Connecting on : "+adresa.getHostAddress()+" with hostname : "+adresa.getHostName()+"\n"); 


    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
           oos.writeObject("HalloXXXX"); 


           ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
           String message = (String) ois.readObject(); 
           System.out.println("Message Received: " + message); 
           ois.close(); 
           oos.close(); 
           socket.close(); 
} 
} 

回答

3

您只能使用ObjectOutputStream的與其他Java程序也使用ObjectInputStream的閱讀。很難想象一個支持Java序列化格式的C程序。

如果你想寫的文字,我建議你使用的PrintWriter /或BufferedReader中一個更好的解決方案是使用的BufferedOutputStream,做你自己的編碼(所以你看到的所有錯誤。

0

和u應該使用oos.flush()在writeObject()方法之後。