使用Java服务器与C#客户端成功建立套接字通信后,Java服务器如何主动向C#客户端发送消息?我只能在成功建立的那一刻向客户发送信息,但这不是我想要的。
项目启动时将开始创建套接字连接,但在建立之后,我无法自己向客户端发送信息。
-----这是负责建立套接字通信的代码。
public void openSocket() throws IOException {
Socket socket = null;
try {
ServerSocket serverSocket = new ServerSocket(5656);
log.info("server msg : UnitySocket server start {port : [5656]}");
socket = serverSocket.accept();
log.info("server msg : socket msg [client send !]");
inputStream = new BufferedInputStream(socket.getInputStream());
byte[] out_massage = new byte[messageLengthBytes];
inputStream.read(out_massage);
log.info("server msg : client msg is [ "+(new String(out_massage,"utf-8")));
OutputStream outputStream = socket.getOutputStream();
outputStream.write(socket_massage.getBytes()); // socket_massage = "welcome_send_server_!"
} catch (IOException e) { e.printStackTrace(); }finally {
if(socket != null){ socket.close(); }
socket = null;
}
这是要发送给客户端的数据
public Boolean askMoveUp(String address, String project,
String name, String massage,
String startTime, String endTime, String token) throws IOException {
StringBuffer stringBuffer = new StringBuffer();
SocketMassage socketMassage = new SocketMassage();
String msg;
stringBuffer.append(address).append("_");
stringBuffer.append(project).append("_");
stringBuffer.append(name).append("_");
stringBuffer.append(massage).append("_");
stringBuffer.append(startTime);
msg = stringBuffer.toString();
socketMassage.setMsg(msg);
return true;
}
我想要做的是askMoveUp()方法中的msg数据。如何在openSocket()方法中像socket_massage一样发送给客户端?当项目启动时,socket_massage中的数据被发送到客户端,但msg是如何发送的?希望大家能给我一个帮助,谢谢!
bw.write();里面些什么客户端就收到什么
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
while (true){
Socket socket = serverSocket.accept();
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("我是服务器");
bw.close();
os.close();
socket.close();
}
你好, 请问我应该怎么保存这里面的socket呢? 因为我不是在这个方法里发送信息的, 我是在建立socket连接后, 在其它方法里向客户端发送信息, 我上面第一段代码的功能其实和你的是一样的, 但是这样会有一个问题, 就是假如我从 HTML 页面上通过 POST 请求向服务器发送了一些参数, 服务器里的 controller 拿到参数后给 service 层的代码, 然后我在 service 层中将这些参数拼接成一个字符串, 再将这个字符串通过建立好的 socket 通道发送到 C# 端,
也就是说, service 层怎么把这个参数放到 bw.write(); 中, 这个是我难的问题, 希望你能给我一些提示, 感谢大佬
@苍之弦: 声明个变量把socket 存起来不就行了
@小光:
问题就是这个咯, 明明保存了这个 socket , 为什么会显示为 空呢?
@苍之弦: 你看下我之前写的demo吧,不把socket关掉就可以一直发消息:
package tx;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 6666);
String str = "客户端请求连接";
while (true){
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
PrintWriter printWriter = new PrintWriter(outputStream, true);
printWriter.println(str);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(bufferedReader.readLine());
// socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package tx;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(6666);
Socket socket = null;
//等待套接字响应获取连接
while (true){
socket = serverSocket.accept();
new ServerThread(socket);
Thread.sleep(3000);
ServerThread.sendMessage("服务器发送消息---------------11111");
Thread.sleep(3000);
ServerThread.sendMessage("服务器发送消息---------------22222");
Thread.sleep(3000);
ServerThread.sendMessage("服务器发送消息---------------333");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package tx;
import java.io.*;
import java.net.Socket;
public class ServerThread extends Thread {
private static Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
public ServerThread(Socket aSocket) throws IOException {
this.socket = aSocket;
this.inputStream = aSocket.getInputStream();
this.outputStream = aSocket.getOutputStream();
this.start();
}
public void run(){
//输入流缓存
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String str;
try {
//读取一行数据
String strLine = bufferedReader.readLine();
System.out.println(strLine);
PrintWriter printWriter = new PrintWriter(outputStream, true);
printWriter.println("连接成功!");
// inputStream.close();
// outputStream.close();
// socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void sendMessage(String s) throws IOException {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("服务器发送消息:"+ s);
}
}
@小光:
就是这句, 它只能发送固定的文本, 而无法发送传递进来的参数
ServerThread.sendMessage("服务器发送消息---------------11111");
也就是说它只能发送 服务器发送消息---------------11111 到客户端, 而不能发送
public void msg(String msg){ ServerThread.sendMessage(msg); }
到客户端, 但是不应该是这样的啊, 想不明白, 少了什么么?
挨,,不管怎么样, 还是非常感谢你的热心帮助,
@苍之弦: 你看下这个demo的结构,我是用while保持客户端和服务器一直在运行状态,socket也没关闭
@小光:
我在创建连接的地方使用一个变量和 get() / set() 方法来保存 socket ,但是我在另一个类里的方法想要调用这个变量的时候, 却发现这个变量为空, 如果不能在其它地方自由的获取 socket , 那么,,,,那么,,,哭唧唧
@苍之弦: 直接用静态变量不就行了,你这样不会是new这个类了吧,new了肯定变量就是null了