获取tcp C#服务器与java客户端进行通信的问题

时间:2016-11-20 02:14:26

标签: java c# multithreading sockets tcp

我一直在努力让我的C#服务器与我的java客户端程序进行通信。问题是C#服务器无法通过流将信息发送到java客户端。问题是我能够从java客户端程序获取信息。我知道文件和多线程服务器可能会让它更混乱。但首先是代码:

C#服务器代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Project
{
class TcpServerCode
{
    private List<clientHolder> clientHolderList = new List<clientHolder>();
    private TcpListener _server;
    private Boolean _isRunning;

    public TcpServerCode(int port)
    {
        _server = new TcpListener(IPAddress.Any, port);
        _server.Start();

        _isRunning = true;

        if(!System.IO.Directory.Exists(Environment.CurrentDirectory + "\\serverCOM"))
        {
            System.IO.Directory.CreateDirectory(Environment.CurrentDirectory + "\\serverCOM");
        }


        Thread th = new Thread(this.LoopClients);
        th.Start();
    }

    public void LoopClients()
    {
        while (_isRunning)
        {
            try
            {
                // wait for client connection
                TcpClient newClient = _server.AcceptTcpClient();


                // client found.
                // create a thread to handle communication
                Thread t = new Thread(new ParameterizedThreadStart(HandleClient));
                clientHolder ch = new clientHolder();
                ch.generateRandomName();
                ch._tcp = newClient;
                clientHolderList.Add(ch);
                t.Start(ch);
            }
            catch(Exception i)
            {
                Log.handleException(i);
            }
        }
    }

    public  void HandleClient(object obj)
    {
        // retrieve client from parameter passed to thread
        clientHolder client = (clientHolder)obj;

        // sets two streams
        //StreamWriter sWriter = new StreamWriter(client._tcp.GetStream(), Encoding.ASCII);
        NetworkStream ns = client._tcp.GetStream();
        client._tcp.GetStream().ReadTimeout = 100;
        StreamReader sReader = new StreamReader(client._tcp.GetStream(), Encoding.ASCII);

        // you could use the NetworkStream to read and write, 
        // but there is no forcing flush, even when requested

        Boolean bClientConnected = true;
        String sData = null;

        Task getter = null;
        Task sender = null;
        while (bClientConnected)
        {
            if (getter != null)
            {
                if (getter.IsCompleted)
                {
                    getter = _get(sReader, client.clientName);
                }
            }
            else
            {

                getter = _get(sReader, client.clientName);
            }


            if (sender != null)
            {
                if (sender != null)
                {
                    sender = _send(ns, client.clientName);
                }
            }
            else
            {
                sender = _send(ns, client.clientName);
            }





            /* if (sender != null)
             {
                 if(sender.IsCompleted)
                 {
                     sender = _send(ns, client.clientName);
                 }
             }
             else
             {
                 sender = _send(ns, client.clientName);
             }*/
        }
    }

    public int getServerClientCount()
    {
        try
        {
            List<clientHolder> tempClientHolder = new List<clientHolder>();
            foreach(clientHolder ch in clientHolderList)
            {
                if(ch._tcp.Connected)
                {
                    tempClientHolder.Add(ch);
                }
            }
            clientHolderList = tempClientHolder;
            return clientHolderList.Count;
        }
        catch(Exception i)
        {
            Log.handleException(i);
            return -1;
        }
    }

    private static async Task _get(StreamReader reader, string clientName)
    {
        string sData = null;
        sData = await reader.ReadLine();


            // shows content on the console.
        if (sData != null)
        {
            try
            {
                if (System.IO.File.Exists(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_get.txt"))
                {
                    System.IO.File.Delete(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_get.txt");
                }
                System.IO.File.WriteAllText(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_get.txt", sData);
            }
            catch (Exception i)
            {
                Log.handleException(i);
            }

        }
    }


    private static async Task _send(NetworkStream ns, string clientName)
    {
        string[] nuller = { "one" };

        if (System.IO.File.Exists(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_send.txt"))
        {
            try
            {

                string info = System.IO.File.ReadAllText(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_send.txt");
                byte[] toSend = Encoding.ASCII.GetBytes(info);
                await ns.Write(toSend, 0, toSend.Length);
                System.IO.File.WriteAllLines(Environment.CurrentDirectory + "\\_sent", nuller);
                System.IO.File.Delete(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_send.txt");

            }
            catch (Exception i)
            {
                Log.handleException(i);
            }
        }
    }

    public string getServerClientName(int index)
    {
        try
        {
            List<clientHolder> tempClientHolder = new List<clientHolder>();
            foreach (clientHolder ch in clientHolderList)
            {
                if (ch._tcp.Connected)
                {
                    tempClientHolder.Add(ch);
                }
            }
            clientHolderList = tempClientHolder;
            return clientHolderList[index].clientName;
        }
        catch (Exception i)
        {
            Log.handleException(i);
            return null;
        }
    }

    public bool sendServerMessage(string clientName, string info)
    {
        try
        {



            if(System.IO.File.Exists(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_send.txt"))
            {
                System.IO.File.Delete(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_send.txt");
            }
            System.IO.File.WriteAllText(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_send.txt", info);
            System.IO.File.WriteAllText(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_okToRead", info);
            return true;

        }
        catch(Exception i)
        {
            Log.handleException(i);
            return false;
        }
    }

    public string getServerMessage(string clientName, string info)
    {
        try
        {
            if(System.IO.File.Exists(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_get.txt"))
            {
                string results = System.IO.File.ReadAllText(Environment.CurrentDirectory + "\\serverCOM\\" + clientName + "_get.txt");
                return results;
            }
            else
            {
                return null;
            }
        }
        catch(Exception i)
        {
            Log.handleException(i);
            return null;
        }
    }

}

public class clientHolder
{
    public TcpClient _tcp;
    public string clientName;

    public void generateRandomName()
    {
        Random rand = new Random();
        clientName = "Client_" + Convert.ToString(rand.NextDouble());
    }
}

此处还有java客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;

public class CoreServer {


public static void main(String[] args) throws IOException{
    String serverAddress = JOptionPane.showInputDialog(
            "Enter IP Address of a machine that is\n" +
            "running the date service on port 4444:");
    try{
        Socket s = new Socket(serverAddress, 4444);
        ClientServerOutputReader csor = new ClientServerOutputReader(s);
        csor.start();

        ClientUserInputReader cuir = new ClientUserInputReader(s);
        cuir.start();

    } catch(UnknownHostException i){
        System.err.println("Don't know about host");
        System.err.println(i.getMessage());
    } catch(IOException i){
        System.err.println("couldn't get I/O for the connection");
        System.err.println(i.getMessage());
    }
}
}


class ClientServerOutputReader extends Thread {
Socket serverSocket;
public ClientServerOutputReader(Socket serverSocket){
    this.serverSocket = serverSocket;
        }

public void run() {
    try {
        BufferedReader in = new BufferedReader(
        new InputStreamReader(serverSocket.getInputStream()));

        String outputFromServer="";
        while((outputFromServer=in.readLine())!= null){
            //This part is printing the output to console
            //Instead it should be appending the output to some file
            //or some swing element. Because this output may overlap
            //the user input from console
            System.out.println(outputFromServer);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

class ClientUserInputReader extends Thread {
Socket serverSocket;
public ClientUserInputReader(Socket serverSocket){
    this.serverSocket = serverSocket;
}
public void run(){
    BufferedReader stdIn = new BufferedReader(
             new InputStreamReader(System.in));
    PrintWriter out;
    try {
        out = new PrintWriter(serverSocket.getOutputStream(), true);
        String userInput;

        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

整个想法是让tcp监听器然后解压缩tcp客户端,通过线程将其发送到类似回调的方法,在名称的末尾为其分配一个带有随机双精度的客户端名称。线程与主线程通信的方式是通过文件,文件clientname_send.txt和clientname_get.txt用于获取和发送消息到客户端程序。我打赌这些文件存在问题,但在大多数情况下,我并没有真正得到任何例外。非常感谢任何人帮助我!我知道这是一团糟,我一整天都在努力,需要一些新的眼光来看待它。

0 个答案:

没有答案