客户端通过服务器进行通信

是tcp字符流通信,但不知道哪儿出问题了,想要大老修改一下代码
这是客户端的

package Task1;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 15122
 */
public class Client {
    public String HOST_NAME;
    public int HOST_PORT;
    
    public Client(String Name,int Port){
        HOST_NAME=Name;
        HOST_PORT=Port;
    }
    
    
    public void startClient(){
      Socket socket = null;
      Scanner keyboardInput = new Scanner(System.in);
      try
      {  socket = new Socket("127.0.0.1", HOST_PORT);
         System.err.println("Connection successful " );
      }
      catch (IOException e)
      {  System.err.println("Client could not make connection: " + e);
         System.exit(-1);
      }
      BufferedReader br;
      BufferedWriter bw;
      InputStreamReader isr;
      OutputStream os;
      InputStream is;
      do{
      try
      {  
         os = socket.getOutputStream();
         bw = new BufferedWriter(new OutputStreamWriter(os));
         bw.write(HOST_NAME+" : "+keyboardInput.nextLine());
         bw.newLine();
         bw.flush();
         
        
         is = socket.getInputStream();
         isr = new InputStreamReader(is);
         br = new BufferedReader(isr);
         String info = null;
         info = br.readLine();
         if (info != null) {
            System.out.println(info);
            } if(info==null){            
             is.close();
             os.close();
             bw.close();
             br.close();
             System.out.println("done");
            }
      }
       catch (UnknownHostException e) {
            e.printStackTrace();
       }
      catch (IOException e)
      {  System.err.println("Client error with chat: " + e);
      }
    }while(!"Exit".equals(keyboardInput.nextLine()));
        try {
            socket.close();
             System.out.println("done1");
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 
}

这是服务器的

package Task1;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
 *
 * @author 15122
 */
public class Server {
    
    public static final int PORT = 8888;
    
    
    public Server(){
    
    }
    
    public void startServer(){
    
    ServerSocket serverSocket = null;
    try
    {
        serverSocket = new ServerSocket(PORT);
        System.out.println("Server started at "+ InetAddress.getLocalHost() + " on port " + PORT);
    }
    catch(IOException e){
         System.err.println("Server can't listen on port: " + e);
         System.exit(-1);
    }
    try{
        while(true)
        {
            Socket socket = serverSocket.accept();
            ServerThread serverThread = new ServerThread(socket);
            serverThread.start();
            InetAddress address = socket.getInetAddress();
            System.out.println("Connection made with "+ address);
        }
    }
    catch(IOException e){
        System.err.println("Can't accept client connection: " + e);
    }
    System.out.println("Server finishing");
    }

    

这是服务器线程

package Task1;

/**
 *
 * @author 15122
 */
import java.io.*;
import java.net.Socket;
 

public class ServerThread extends Thread {
    Socket socket = null;
 
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
 
    public void run() {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        OutputStream os = null;
        PrintWriter pw = null;
        String info;
        info = "start";
        try {
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            os = socket.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
            info = br.readLine();
            do{ 
                System.out.println( info);
                bw.write(info);
                bw.newLine();
                bw.flush();
                info =br.readLine();
           
            }while(br.readLine()!=null);
            }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        do{
         try {
                    if (pw != null)
                        pw.close();
                    if (os != null)
                        os.close();
                    if (is != null)
                        is.close();
                    if (isr != null)
                        isr.close();
                    if (br != null)
                        br.close();
                    if (socket != null)
                        socket.close();
                     System.out.println("done2");
                } catch (IOException e) {
                    e.printStackTrace();
 
                }
        }while(info == null);
    }
}


这是客户端1


package Task1;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author 15122
 */
public class TestChat {
    public static void main(String[] args) {
        Client client1 = new Client("Client1",8888);
        client1.startClient();
    }
}

这是客户端2


```java

package Task1;

/**
 *
 * @author 15122
 */
public class TestChat1 {
    public static void main(String[] args) {
        
        Client client2 = new Client("Client2",8888);
       
        client2.startClient();
    }
}

这是服务器启动main()

```java
package Task1;

/**
 *
 * @author 15122
 */
public class runServer {
     public static void main(String[] args) {
         Server server = new Server();
         server.startServer();
     }
}

这些代码有部分是从网上找来的

只需更改Client和ServerThread的代码即可,参考:

package TCP;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
/**
 *
 * @author 15122
 */
public class Client {
    public String HOST_NAME;
    public int HOST_PORT;

    public Client(String Name,int Port){
        HOST_NAME=Name;
        HOST_PORT=Port;
    }
    public void startClient(){
        Socket socket = null;
        Scanner keyboardInput = new Scanner(System.in);
        try {
            socket = new Socket("127.0.0.1", HOST_PORT);
            System.err.println("Connection successful " );
        }
        catch (IOException e) {
            System.err.println("Client could not make connection: " + e);
            System.exit(-1);
        }
        BufferedReader br = null;
        BufferedWriter bw=null;
        InputStreamReader isr=null;
        OutputStream os = null;
        InputStream is = null;
        try {
            os = socket.getOutputStream();
            bw = new BufferedWriter(new OutputStreamWriter(os));
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);

            while (true){
                String toServer=keyboardInput.nextLine();
                bw.write(HOST_NAME+" : "+toServer);
                bw.newLine();
                bw.flush();
                String info = null;
                info = br.readLine();
                if (info != null) {
                    System.out.println(info);
                }
                if(info==null){
                    is.close();
                    os.close();
                    bw.close();
                    br.close();
                    System.out.println("done");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
package TCP;

/**
 *
 * @author 15122
 */
import java.io.*;
import java.net.Socket;


public class ServerThread extends Thread {
    Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        OutputStream outputStream = null;
        PrintWriter printWriter = null;
        BufferedWriter bufferedWriter = null;
        String info;
        try {
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
            inputStreamReader = new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(inputStreamReader);
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));

            while (true) {
                info = bufferedReader.readLine();
                if(info!=null){
                    System.out.println(info);
                    bufferedWriter.write(info);
                    bufferedWriter.newLine();
                    bufferedWriter.flush();
                }else{
                    try {
                        if (printWriter != null)
                            printWriter.close();
                        if (outputStream != null)
                            outputStream.close();
                        if (inputStream != null)
                            inputStream.close();
                        if (inputStreamReader != null)
                            inputStreamReader.close();
                        if (bufferedReader != null)
                            bufferedReader.close();
                        if (socket != null)
                            socket.close();
                        System.out.println("done2");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

img

出什么问题了呢?socket通信最好是转换为字节流进行收发。

一是客户端连接指向 127.0.0.1,你这通信只能在一台机器上玩啊?
二是服务端什麽时候启动侦听的呢?没有侦听就没有accept

具体什么问题没有描述。这种问题需要调试一下才能解决。

按这个调整下
服务器代码

public class ServerSocket {
 
    //客户端发送信息
    public static void main(String[] args) {
        OutputStream out = null;
        Socket socket = null;
        try {
            //绑定到本地端口
            socket = new Socket("127.0.0.1", 8090);
            //发送消息
            while (true) {
                System.out.println("==========");
                out = socket.getOutputStream();
                //输入文字,从控制台输入
                Scanner san = new Scanner(System.in);
                String str = san.next();
                System.out.println("我:" + str);
                out.write(str.getBytes());
                out.flush();
                //接收信息
                InputStream in = socket.getInputStream();
                //获取输入流里面数据并存储数据
                byte[] b = new byte[1024];
                StringBuffer sb = new StringBuffer();
                String s;
                if (in.read(b) != -1) {
                    s = new String(b);
                    System.out.println(s);
                    sb.append(s);
                }
                System.out.println("来自服务器的数据:" + sb);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码


public class ClientSocket {
    public static void main(String[] args) {
        ServerSocket server;
        try {
            server = new ServerSocket(8090);
            Socket socket=server.accept();
            while(true){
                System.out.println("----------");
                InputStream in;
                try {
                    in = socket.getInputStream();
                    byte [] b=new byte[1024];
                    StringBuffer sb=new StringBuffer();
                    String s;
                    if(in.read(b) !=-1){
                        s=new String(b);
                        sb.append(s);
                    }
                    OutputStream out=socket.getOutputStream();
                    System.out.println("客户端信息:"+sb);
                    Scanner sc=new Scanner(System.in);
                    String str=sc.next();
                    System.out.println("我:"+str);
                    out.write(str.getBytes());
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端通过服务端进行通信
输入reg,进行注册
输入send,输入name,向其他客户端发送信息
输入all,向其他所有客户端发送信息
客户端的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<pthread.h>

#define PORT 33333
#define LINE 1024
struct message
{
int action;
char toname[20];
char msg[1024];
};
void * recv_message(void *arg)
{
int ret;
int cfd = *((int *)arg);
struct message *msg = (struct message *)malloc(sizeof(struct message));
while(1)
{
memset(msg,0,sizeof(struct message));
ret = recv(cfd,msg,sizeof(struct message),0);
if(ret < 0)
{
perror("recv error!\n");
exit(1);
}
if(ret == 0)
{
printf("%d is closed\n",cfd);
pthread_exit(NULL);
}
switch(msg->action)
{
case 1:
{
printf("reg success!\n");
break;
}
case 2:
{
printf("recv success!\n");
printf("recv message:%s\n",msg->msg);
break;
}
case 3:
{
printf("all recv success!\n");
printf("all recv message:%s\n",msg->msg);
break;
}
}
usleep(3);
}

 pthread_exit(NULL);

}
int main()
{
int sockfd;
char buffer[1024];
pthread_t id;
char cmd[20];
char name[20];
char toname[20];
char message[1024];
struct sockaddr_in s_addr;

if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket error!");
exit(1);
}

printf("client socket success!\n");

bzero(&s_addr,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
s_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(sockfd,(struct sockaddr *)(&s_addr),sizeof(struct sockaddr_in)) < 0)
{
perror("connect error!\n");
exit(1);
}

printf("connect success!\n");
if(pthread_create(&id,NULL,recv_message,(void *)(&sockfd))!=0)
{
perror("error\n");
exit(1);
}
struct message *msg = (struct message *)malloc(sizeof(struct message));
printf("cmd : reg send all!\n...");

while(1)
{
printf("Please input cmd:\n");
scanf("%s",cmd);
if(strcmp(cmd,"reg") == 0)
{
printf("Please input reg name:\n");
scanf("%s",name);
msg->action = 1;
strcpy(msg->msg,name);

    if(send(sockfd,msg,sizeof(struct message),0) < 0)
    {
        printf("send name error\n");
        exit(1);
    }
}
if(strcmp(cmd,"send") == 0)
{
    printf("Please input send to name:\n");
    scanf("%s",toname);
    
    printf("Please send message :\n");
    scanf("%s",message);
    msg->action = 2;
    strcpy(msg->toname,toname);
    strcpy(msg->msg ,message);
    
    if(send(sockfd,msg,sizeof(struct message),0) < 0)
    {
        printf("send message error\n");
        exit(1);
    }
}
if(strcmp(cmd,"all") == 0)
{
    printf("Please input all message:\n"); 
    scanf("%s",message);
    msg->action = 3;
    strcpy(msg->msg ,message);
    send(sockfd,msg,sizeof(struct message),0);    
}

}

shutdown(sockfd,SHUT_RDWR);
return 0;

}
服务器的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<pthread.h>

#define PORT 33333

struct message
{
int action;
char toname[20];
char msg[1024];
};

struct online
{
int cfd;
char name[20];
struct online *next;
};

struct online *head = NULL;

void insert_user(struct online *new)
{
if(head == NULL)
{
new->next = NULL;
head = new;
}
else
{
new->next = head->next;
head->next = new;
}
}
int find_cfd(char *toname)
{
if(head == NULL)
{
return -1;
}
struct online *temp = head;
while(temp != NULL)
{
if(strcmp(temp->name ,toname) == 0)
{
return temp->cfd ;
}
temp= temp->next ;
}
return -1;
}
void * recv_message(void arg)
{
int ret;
int to_cfd;
int cfd =
((int *)arg);
struct message *msg = (struct message *)malloc(sizeof(struct message));
struct online *new;
while(1)
{
memset(msg,0,sizeof(struct message));
ret = recv(cfd,msg,sizeof(struct message),0);
if(ret < 0)
{
printf("recv error!\n");
exit(1);
}
if(ret == 0)
{
printf("%d is closed\n",cfd);
pthread_exit(NULL);
}
switch(msg->action)
{
case 1:
{
printf("client reg success!\n");
new = (struct online *)malloc(sizeof(struct online));
new->cfd = cfd;
strcpy(new->name ,msg->msg);
insert_user(new);
msg->action = 1;
send(cfd,msg,sizeof(struct message),0);
break;
}
case 2:
{
to_cfd = find_cfd(msg->toname );
msg->action = 2;
send(to_cfd,msg,sizeof(struct message),0);
break;
}
case 3:
{
struct online *temp = head;
while(temp != NULL)
{
to_cfd = temp->cfd ;
msg->action = 3;
send(to_cfd,msg,sizeof(struct message),0);
temp = temp->next ;
}
break;
}
}
usleep(3);
}
pthread_exit(NULL);
}
int main()
{
int cfd;
int sockfd;

int len;

char buf[1024];
struct sockaddr_in addr;
struct sockaddr_in c_addr;

pthread_t id;

sockfd=(socket(AF_INET,SOCK_STREAM,0));
if(sockfd==-1)
{
    perror("socket error\n");
    exit(1);
}
printf("socket success\n");

int opt=1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);//瀛楄妭搴忚浆鍖?杞垚鏈湴鐨勭鍙e彿
//addr.sin_addr.s_addr=inet_addr(ip_addr);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(sockfd,(struct sockaddr*)(&addr),sizeof(struct sockaddr_in))<0)
{
    perror("bind error\n");
    exit(1);
}
printf("bind success\n");

if(listen(sockfd,3)<0)
{
    perror("listen error\n");
    exit(1);
}
printf("listen success\n");

while(1)
{
    memset(buf,0,sizeof(buf));
    bzero(&c_addr,sizeof(struct sockaddr_in));
    len=sizeof(struct sockaddr_in);
    
    printf("accepting.........\n");
    if((cfd=accept(sockfd,(struct sockaddr*)(&c_addr),&len))==-1)
    {
        perror("accept error\n");
        exit(1);
    }
    printf("port=%d   ip=%s\n",ntohs(c_addr.sin_port),inet_ntoa(c_addr.sin_addr));
    if(pthread_create(&id,NULL,recv_message,(void *)(&cfd)) != 0)
    {
        printf("pthread create error\n");
        exit(1);
    }
    sleep(2);
}
return 0;

}
OK