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

苍之弦 2019-08-15 01:06:00
使用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是如何发送的?希望大家能给我一个帮助,谢谢!
...全文
231 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
datafansbj 2019-08-21
  • 打赏
  • 举报
回复
如果你需要服务端不断地与客户端交互,那么你需要如下编程模式(阻塞模式): 1、服务端接受客户端的连接,生成一个 socket 2、socket 执行 read,直到读完客户端发出的消息(此时客户端为阻塞状态,正在 Read,此处注意 TCP 有粘包问题) 3、服务端处理接收到的消息进行处理,将结果发给客户端 4、循环到第2步,直到 socket 被关闭(可以由客户端关闭,此时服务端 Read 到 0 字节,也可以服务端主动关闭,那么客户端或读到 0 字节,谁先 Close 就在本端产生 Timewait) 5、客户端的逻辑与此类似,发送完后开始 Read,读完数据后再向服务端发送数据,然后继续 Read,不断循环,直到 socket 被关闭 非阻塞模式比较复杂,涉及异步编程,你可以了解一下完成端口模式(IOCP)是怎样实现的。
datafansbj 2019-08-20
  • 打赏
  • 举报
回复
Socket 被关闭是因为这个 Socket 是局部变量,作用域仅限函数内。你应该在更大范围内定义 Socket,这样在整个类内部都可以使用。
datafansbj 2019-08-20
  • 打赏
  • 举报
回复
使用 Socket 网络编程基本的操作。服务端 Accept 一个 Socket 后,能获取一个网络流 NetStream,你可以在这个流上进行读取、写入等操作。读取就是读取对方发给你的数据,写入就是向对方回发数据,不断地读写,双方就这样交互,直到 Socket 被关闭。
苍之弦 2019-08-20
  • 打赏
  • 举报
回复
引用 11 楼 datafansbj 的回复:
Socket 被关闭是因为这个 Socket 是局部变量,作用域仅限函数内。你应该在更大范围内定义 Socket,这样在整个类内部都可以使用。
那么请问我应该怎样让我的 service 层的代码拿到负责 socket 连接处的获取到的 socket 呢? 这个真的好难想哦, 如果没法保留这个 socket , 那么这个 socket 连接还有意义么? 总不能只是在连接的那一刻给客户端发个 "hello world" 吧, 还请大佬指点
苍之弦 2019-08-15
  • 打赏
  • 举报
回复
引用 7 楼 maradona1984 的回复:
[quote=引用 6 楼 苍之弦 的回复:] [quote=引用 5 楼 maradona1984 的回复:] [quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote]
引用 5 楼 maradona1984 的回复:
[quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote] 有想过使用 netty 做框架, 但是我对netty并不是很熟练, 现在这个任务有点紧, 怕学习成本太大, 所以才想着用 socket 来实现一个简单的通信, 只是没想到我居然没法在别的方法里调用socket......感谢各位的关注与热情,,,,,[/quote] 如果要应用到生产环境的代码.个人是不太建议直接用Socket,比如你的问题你就很难健壮的搞定,就算你能发送请求,你的socket断开你怎么处理,你得自己去实现断开事件,如何保持连接,你得自己发心跳,你解决一个问题还会遇到更多的问题,但这些框架都替你实现了或者有更简单的解决方案[/quote]
引用 7 楼 maradona1984 的回复:
[quote=引用 6 楼 苍之弦 的回复:] [quote=引用 5 楼 maradona1984 的回复:] [quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote]
引用 5 楼 maradona1984 的回复:
[quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote] 有想过使用 netty 做框架, 但是我对netty并不是很熟练, 现在这个任务有点紧, 怕学习成本太大, 所以才想着用 socket 来实现一个简单的通信, 只是没想到我居然没法在别的方法里调用socket......感谢各位的关注与热情,,,,,[/quote] 如果要应用到生产环境的代码.个人是不太建议直接用Socket,比如你的问题你就很难健壮的搞定,就算你能发送请求,你的socket断开你怎么处理,你得自己去实现断开事件,如何保持连接,你得自己发心跳,你解决一个问题还会遇到更多的问题,但这些框架都替你实现了或者有更简单的解决方案[/quote]
引用 7 楼 maradona1984 的回复:
[quote=引用 6 楼 苍之弦 的回复:] [quote=引用 5 楼 maradona1984 的回复:] [quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote]
引用 5 楼 maradona1984 的回复:
[quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote] 有想过使用 netty 做框架, 但是我对netty并不是很熟练, 现在这个任务有点紧, 怕学习成本太大, 所以才想着用 socket 来实现一个简单的通信, 只是没想到我居然没法在别的方法里调用socket......感谢各位的关注与热情,,,,,[/quote] 如果要应用到生产环境的代码.个人是不太建议直接用Socket,比如你的问题你就很难健壮的搞定,就算你能发送请求,你的socket断开你怎么处理,你得自己去实现断开事件,如何保持连接,你得自己发心跳,你解决一个问题还会遇到更多的问题,但这些框架都替你实现了或者有更简单的解决方案[/quote] OK ,,,,,我听大佬的,,去研究一下 netty 的用法吧
maradona1984 2019-08-15
  • 打赏
  • 举报
回复
引用 6 楼 苍之弦 的回复:
[quote=引用 5 楼 maradona1984 的回复:] [quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote]
引用 5 楼 maradona1984 的回复:
[quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote] 有想过使用 netty 做框架, 但是我对netty并不是很熟练, 现在这个任务有点紧, 怕学习成本太大, 所以才想着用 socket 来实现一个简单的通信, 只是没想到我居然没法在别的方法里调用socket......感谢各位的关注与热情,,,,,[/quote] 如果要应用到生产环境的代码.个人是不太建议直接用Socket,比如你的问题你就很难健壮的搞定,就算你能发送请求,你的socket断开你怎么处理,你得自己去实现断开事件,如何保持连接,你得自己发心跳,你解决一个问题还会遇到更多的问题,但这些框架都替你实现了或者有更简单的解决方案
苍之弦 2019-08-15
  • 打赏
  • 举报
回复
引用 5 楼 maradona1984 的回复:
[quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote]
引用 5 楼 maradona1984 的回复:
[quote=引用 4 楼 苍之弦 的回复:] [quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好[/quote] 有想过使用 netty 做框架, 但是我对netty并不是很熟练, 现在这个任务有点紧, 怕学习成本太大, 所以才想着用 socket 来实现一个简单的通信, 只是没想到我居然没法在别的方法里调用socket......感谢各位的关注与热情,,,,,
maradona1984 2019-08-15
  • 打赏
  • 举报
回复
引用 4 楼 苍之弦 的回复:
[quote=引用 3 楼 datafansbj 的回复:] 你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?[/quote] 存在map里是对的,你为什么会保存不了?当然个人觉得你真要做这个还是用netty这种成熟的socket框架来开发,不然你要做很多额外工作来保证程序的健壮性,也不一定能做得更好
苍之弦 2019-08-15
  • 打赏
  • 举报
回复
引用 3 楼 datafansbj 的回复:
你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
我在后面把关闭socket的代码删掉了, 还是没法获取socket, 现在全网的教程都是在教发送固定的字符串, outputStream.write(socket_massage.getBytes()); 就像这句代码, 他只能发送写好的, 定义好的字符串到客户端, 但是我希望在service层的代码中随心所欲的向 客户端 发送信息, 这就需要我 service 层的代码里有 socket 的值, 但是我发现这个 socket 既没法保存在 Map 里给别的方法调用, 也不能保存在变量里给别的方法调用, 想来不应该啊? 难道socket通信是不可控的? 我不能像什么时候发信息就什么时候发信息,,想法什么就发什么么?
datafansbj 2019-08-15
  • 打赏
  • 举报
回复
你在调用 openSocket 时,向这个 Socket 发送了数据,然后就关闭了(这个Socket作用域仅限函数内),当然不能再发数据了。
苍之弦 2019-08-15
  • 打赏
  • 举报
回复
引用 1 楼 qq_39769092 的回复:
问题描述不清楚,建议学习一下原生socket通信,直接抛需求,让别人帮你写代码不合适,
emmm,,,我也很懵啊,,但是这个问题还是描述得不够清楚么? 我也不是说想要大家帮我写代码啦, 只是想不明白, 在建立socket通信后, 服务端该怎样才能发送自己想要的信息到 客户端 呢? 例如我上面的代码, 发送给客户端的信息用的是 outputStream.write(socket_massage.getBytes()); 这句代码, 然后 socket_massage 是我自己定义的一个字符串, 这个行代码会在通信建立的一开始主动发送给客户端, 但是之后我还想发送到客户端该怎么办? 我试过用 Map 来保存 socket , 但是得到的值的空, 这个问题我想了很久都没能得到答案, 我是哪里想错了么? 我不用大家帮我写代码,,就是,,,给我一个思路就行, 我现在想破头都想不到怎么解决诶
三宝子 2019-08-15
  • 打赏
  • 举报
回复
问题描述不清楚,建议学习一下原生socket通信,直接抛需求,让别人帮你写代码不合适,

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧