首页新闻找找看学习计划

java网络数据传输问题求解

0
[待解决问题]

客户端代码

import java.io.*;

import java.net.Socket;

 

/**

 * Created by apple on 17-6-7.

 * 多线程版本

 * 让程序能够支持客户端一边输入一边接收来自服务端的消息

 */

public class TCPClient2 {    //testClient

    public static void main(String[] args){

        Client sparkClient = new Client("Spark", "127.0.0.1", 8888);

    }

}

 

class Client{

    private static int totalNum = 0;            //记录连接的客户端总数量

    private Socket clientSock;

    private String userName;                    //客户端用户名

    private final int ID = ++totalNum;           //标识客户端唯一的号码,类似QQ号,且一经注册变不可改变

    private BufferedReader clientReader;        //客户端读入流

    private BufferedReader userInputReader;

    private PrintWriter clientWriter;                   //客户端向服务端的输出流

    private String clientInput;                         //客户端读入的数据,即从服务端传来的数据

    private String userInput;

    private Thread inputThread = new Thread(new ClientRead());          //监控输入的线程

    private Thread outputThread = new Thread(new ClientWrite());        //监控输出的线程

 

    /*public Client(String userName, Socket sock){

        //this(userName, (String)sock.getInetAddress(), sock.getPort());

        //??????????

        clientSock = sock;

    }*/

 

    public Client(String userName, String ipAddress, int port){

        try{

            //id = ++totalNum;

            clientSock = new Socket(ipAddress, port);

            this.userName = userName;

            clientReader = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));

            clientWriter = new PrintWriter(clientSock.getOutputStream(), true);

            userInputReader = new BufferedReader(new InputStreamReader(System.in));

            inputThread.start();

            outputThread.start();

            System.out.println("Connected, just enjoy the communication!");

        } catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

    }

 

    public Client(){

        this("Durant", "127.0.0.1", 8888);

        //this((Socket) ("Spark","127.0.0.1", 8888));

    }         //尝试随机产生类似QQ号的号码,用户名可以重复

 

    protected void finalize(){close();}

 

    //getter

    public Socket getSocket(){

        return clientSock;

    }

    public int getID (){return ID;}

    public String getUserName(){return userName;}

    //public String getClientInput(){return clientInput;}

    //public BufferedReader getClientReader(){return clientReader;}

    //public PrintWriter getClientOutput(){return clientWriter;}

    public String getUserInput(){       //客户端接受用户的输入作为写入服务端的信息

        //inputHint();

        try{

            userInput = userInputReader.readLine();

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

        return userInput;

    }

 

    //setter

    public void setSocket(Socket sock){

        clientSock = sock;

    }

    public void setUserName(String userName){this.userName = userName;}

 

 

    //从客户端读入来自服务端或用户写入的数据

    public String read(){

        try {

            clientInput = clientReader.readLine();   //将服务端写入的数据读入进来

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

        return clientInput;

    }

 

    //从客户端写入数据到服务端

    public void write(){

        getUserInput();

        clientWriter.println(userInput);

        clientWriter.flush();

        //  clientOutput.flush();

    }

 

    //将服务端传来的消息打印出来

    public void printServerMessage(){

        System.out.println("Server:" + clientInput);

    }

 

    public void printClientMessage(){

        System.out.println("Client:" + userInput);

    }

 

    public void printServerDisconnected() { System.out.println("Sorry, the server is disconnected!"); }

    public void printClientDisconnected() { clientWriter.println("User#" + ID + ", " + userName + "is disconnected!"); }

 

    public void close(){

        try{

            clientSock.close();

            clientReader.close();

            userInputReader.close();

            clientWriter.close();

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

    }

 

    //判断服务器是否仍在连接中

    public boolean serverIsConnected(){

        return !clientInput.equals("bye");

    }

 

    public boolean clientIsConnected(){

        return !getUserInput().equals("bye");

    }

 

    //实现线程的方法————时刻准备接收来自服务端的消息

    public class ClientRead implements Runnable {

        public void run() {

            read();

            while (clientReader != null && serverIsConnected() && clientInput.length()!=0)  {

                printServerMessage();

                read();

            }

            printServerDisconnected();

        }

    }

 

    //实现线程的方法————时刻准备向服务端发送消息

    class ClientWrite implements Runnable{

        public void run() {

            write();

            while (userInputReader != null && clientIsConnected() && userInput.length()!=0){

                //printClientMessage();

                write();

            }

            printClientDisconnected();

 

        }

    }

}

 

服务端代码:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

/**

 * Created by apple on 17-6-7.

 * 多线程版本

 * 让程序能够支持客户端一边输入一边接收来自服务端的消息

 */

 

public class TCPServer {

    public static void main(String[] args){

        Server sparkServer = new Server("Curry", 8888);

    }

}

 

class Server{

    private ServerSocket serverSock;

    private Socket clientSock;

    private String serverName;                    //服务端名

    private BufferedReader serverReader;        //服务端读入流

    private BufferedReader userInputReader;

    private PrintWriter serverWriter;                   //服务端向客户端的输出流

    private String serverInput;                         //服务端读入的数据,即从客户端传来的数据

    private String userInput;

    private Thread inputThread = new Thread(new ServerRead());          //监控输入的线程

    private Thread outputThread = new Thread(new ServerWrite());        //监控输出的线程

 

    public Server(String serverName, int port){

        try{

            this.serverName = serverName;

            serverSock = new ServerSocket(port);

            clientSock = serverSock.accept();

            serverReader = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));

            userInputReader = new BufferedReader(new InputStreamReader(System.in));

            serverWriter = new PrintWriter(clientSock.getOutputStream(), true);

            inputThread.start();

            outputThread.start();

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

    }

 

    public Server(){

        this("SuperQQ", 8888);

    }

 

    protected void finalize(){close();}

 

    //getter

    public ServerSocket getServerSocket(){

        return serverSock;

    }

    public String getServerName(){return serverName;}

    public String getUserInput(){

        try{

            userInput = userInputReader.readLine();

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

        return userInput;

    }

 

    //setter

    public void setServerSocket(ServerSocket serverSock){

        this.serverSock = serverSock;

    }

 

    public void setServerSocket(int port){

        try{

            serverSock = new ServerSocket(port);

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

    }

 

    //接收客户端以及用户在控制台的输入传入服务端

    public String read(){

        try {

            serverInput = serverReader.readLine();   //将客户端写入的数据读入进来

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

        return serverInput;

    }

 

    //从服务端写入数据到客户端

    public void write(){

        getUserInput();

        serverWriter.println(userInput);

        serverWriter.flush();

    }

 

    //将客户端传来的消息打印出来

    public void printClientMessage(){

        System.out.println("Client:" + serverInput);

    }

    //将服务端写的消息打印出来

    public void printServerMessage() { System.out.println("Server:" + userInput); }

 

    public void close(){

        try {

            serverWriter.close();

            userInputReader.close();

            serverReader.close();

            serverSock.close();

        }catch (IOException e){

            e.printStackTrace();

            System.exit(-1);

        }

    }

    //判断服务器是否仍在连接中

    public boolean serverIsConnected(){

        return !serverInput.equals("bye");

    }

 

    public boolean clientIsConnected(){

        return !getUserInput().equals("bye");

    }

 

    //实现线程的方法————时刻准备接收来自客户端的消息

    public class ServerRead implements Runnable {

        public void run() {

            read();

            while (serverReader != null && serverIsConnected() && serverInput.length()!=0) {

                printClientMessage();

                read();

            }

            //printServerDisconnected();

        }

    }

 

    //实现线程的方法————时刻准备向服务端发送消息

    class ServerWrite implements Runnable{

        public void run() {

            write();

            while (userInputReader != null && clientIsConnected() && userInput.length()!=0){

                //printServerMessage();

                write();

            }

            //printClientDisconnected();

        }

    }

}

最后总是按两下回车才有一次显示,而且总是显示不正确。。。希望各位大神能帮帮忙了,谢谢~ 

阿坤_Spark的主页 阿坤_Spark | 菜鸟二级 | 园豆:202
提问于:2017-06-12 21:22
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册