【发布时间】:2017-01-11 20:34:25
【问题描述】:
我有一个简单的 C 服务器和一个简单的 Java 客户端。客户端从键盘获取输入并将其发送到服务器。服务器将其打印并发送回。但它只是第一次工作,可能是什么问题?
主要:
package test;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Client cli = new Client();
cli.connect();
while(sc.hasNextLine()) {
cli.send(sc.nextLine());
System.out.println(cli.rec());
}
}
}
客户:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
Socket socket;
OutputStreamWriter out;
BufferedReader in;
public void connect() {
try {
socket = new Socket("localhost", 50001);
socket.setSoTimeout(5000);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
out = new OutputStreamWriter(socket.getOutputStream());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void send(String message) {
try {
this.out.write(message + "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
this.out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String rec() {
try {
return in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
}
服务器:
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <arpa/inet.h>
#include <errno.h>
#define MY_PORT 50001
#define MAXBUF 1024
int main(int Count, char *Strings[])
{ int sockfd;
struct sockaddr_in self;
char buffer[MAXBUF];
int clientfd;
struct sockaddr_in client_addr;
int addrlen=sizeof(client_addr);
int yes = 1;
/*---Create streaming socket---*/
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("Socket");
exit(errno);
}
/*---Initialize address/port structure---*/
bzero(&self, sizeof(self));
self.sin_family = AF_INET;
self.sin_port = htons(MY_PORT);
self.sin_addr.s_addr = INADDR_ANY;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == 0)
{
printf("Socket options was set.\n"); //TODO
}
else
{
printf("Set socket options failure.\n"); //TODO
}
/*---Assign a port number to the socket---*/
if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 )
{
perror("socket--bind");
exit(errno);
}
/*---Make it a "listening socket"---*/
if ( listen(sockfd, 20) != 0 )
{
perror("socket--listen");
exit(errno);
}
clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
/*---Forever... ---*/
while (1)
{
memset(buffer, 0, MAXBUF);
/*---accept a connection (creating a data pipe)---*/
printf("%s:%d connected\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
recv(clientfd, buffer, MAXBUF, 0);
printf("Server got: %s", buffer);
//sprintf(buffer, "%s\r\n", buffer);
/*---Echo back anything sent---*/
printf("sending...\n");
int n = send(clientfd, buffer, MAXBUF, 0);
printf("sent: %d\n", n);
}
/*---Close data connection---*/
close(clientfd);
/*---Clean up (should never get here!)---*/
close(sockfd);
return 0;
}
【问题讨论】:
-
你不检查
recv返回了多少字节。您假设您可以发送MAXBUF或buffer。客户端代码意味着它只读取一行。 -
我认为
accpet调用应该进入 while 循环。最近一直在玩socket,看看我的messy gist here