我一直在努力让我的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用于获取和发送消息到客户端程序。我打赌这些文件存在问题,但在大多数情况下,我并没有真正得到任何例外。非常感谢任何人帮助我!我知道这是一团糟,我一整天都在努力,需要一些新的眼光来看待它。