首页 新闻 赞助 找找看

Java 如何在建立 Socket 通信后主动向 C#客户端发送信息

0
悬赏园豆:100 [已解决问题] 解决于 2019-08-15 16:43

使用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是如何发送的?希望大家能给我一个帮助,谢谢!

苍之弦的主页 苍之弦 | 菜鸟二级 | 园豆:209
提问于:2019-08-15 14:44
< >
分享
最佳答案
1

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();
    }
收获园豆:100
小光 | 小虾三级 |园豆:1766 | 2019-08-15 15:11

你好, 请问我应该怎么保存这里面的socket呢? 因为我不是在这个方法里发送信息的, 我是在建立socket连接后, 在其它方法里向客户端发送信息, 我上面第一段代码的功能其实和你的是一样的, 但是这样会有一个问题, 就是假如我从 HTML 页面上通过 POST 请求向服务器发送了一些参数, 服务器里的 controller 拿到参数后给 service 层的代码, 然后我在 service 层中将这些参数拼接成一个字符串, 再将这个字符串通过建立好的 socket 通道发送到 C# 端,
也就是说, service 层怎么把这个参数放到 bw.write(); 中, 这个是我难的问题, 希望你能给我一些提示, 感谢大佬

苍之弦 | 园豆:209 (菜鸟二级) | 2019-08-15 15:40

@苍之弦: 声明个变量把socket 存起来不就行了

小光 | 园豆:1766 (小虾三级) | 2019-08-15 15:54

@小光:

问题就是这个咯, 明明保存了这个 socket , 为什么会显示为 空呢?

苍之弦 | 园豆:209 (菜鸟二级) | 2019-08-15 16:04

@苍之弦: 你看下我之前写的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);
    }
}

小光 | 园豆:1766 (小虾三级) | 2019-08-15 16:33

@小光:
就是这句, 它只能发送固定的文本, 而无法发送传递进来的参数
ServerThread.sendMessage("服务器发送消息---------------11111");

也就是说它只能发送 服务器发送消息---------------11111 到客户端, 而不能发送
public void msg(String msg){ ServerThread.sendMessage(msg); }
到客户端, 但是不应该是这样的啊, 想不明白, 少了什么么?
挨,,不管怎么样, 还是非常感谢你的热心帮助,

苍之弦 | 园豆:209 (菜鸟二级) | 2019-08-15 16:43

@苍之弦: 你看下这个demo的结构,我是用while保持客户端和服务器一直在运行状态,socket也没关闭

小光 | 园豆:1766 (小虾三级) | 2019-08-15 16:47

@小光:

我在创建连接的地方使用一个变量和 get() / set() 方法来保存 socket ,但是我在另一个类里的方法想要调用这个变量的时候, 却发现这个变量为空, 如果不能在其它地方自由的获取 socket , 那么,,,,那么,,,哭唧唧

苍之弦 | 园豆:209 (菜鸟二级) | 2019-08-15 17:16

@苍之弦: 直接用静态变量不就行了,你这样不会是new这个类了吧,new了肯定变量就是null了

小光 | 园豆:1766 (小虾三级) | 2019-08-16 08:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册