作者daniel098962 (丹尼尔)
看板java
标题[问题] Socket传值请益
时间Tue Feb 6 23:10:57 2018
安安各位大大好
小弟最近刚接触Socket
想利用Socket再App上能够与一台机器做连线
而这台机器是传正确值给它 它就能够根据讯息回传值回来
因此貌似是不需要server端的程式码(自己也不太确定)
而最近有透过程式大概确定有连线成功
但现在卡在我该怎麽传正确的值给它了
正确的值会像以下的图
https://imgur.com/TQFDlIx.jpg
现在问题就是
我该怎麽像图片那样
一次是传五个byte的值啊
还是得要分五次?
但分五次server端不就会误以为每次只传一个数值吗
真的不知道这边该怎麽解决
抱歉小弟新手
如果解答很简单还望各位大大不要生气~
如有需要程式码 因专案不在身边
恐怕要等明天後再贴上
在此补上程式码网址
https://www.codepile.net/pile/X4KGPe4Q
谢谢各位观看与解惑
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.10.38.120
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1517929860.A.914.html
※ 编辑: daniel098962 (39.10.38.120), 02/06/2018 23:13:17
1F:推 zephyrhymn: 这作业(?)让我想到大学时期的网路概论的作业,用sock 02/07 07:51
2F:→ zephyrhymn: et来模拟TCP/IP的handshaking 行为 02/07 07:51
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 10:04:20
3F:推 zephyrhymn: 怎麽说呢...感觉你对Socket和TCP协定完全没概念... 02/07 10:27
4F:→ zephyrhymn: 你说的分一次或五次都可以 先了解socket的原理你就会 02/07 10:30
5F:推 zephyrhymn: 理解 02/07 10:33
6F:→ zephyrhymn: 不过要先了解server端怎麽处理资料的 你再根据server 02/07 10:34
7F:→ zephyrhymn: 的行为去实作client端的程式 02/07 10:34
8F:→ zephyrhymn: 你这个范例我猜是接受"一组"数列 不确定他怎麽处理5个 02/07 10:35
9F:→ zephyrhymn: 数列的 02/07 10:35
10F:→ zephyrhymn: Java来处理的话 你直接去看Java的Socket怎麽实作即可 02/07 10:36
11F:推 zephyrhymn: 你给的条件不明不确的只说要送socket的话 02/07 10:43
12F:→ zephyrhymn: 去google一下java socket client一堆范例... 02/07 10:43
感谢Z大回文,抱歉小弟没说清楚
确实现在最大的问题,便是不知道设备到底是怎麽接收资料的
只知道这个设备是透过RS232指令监控的
所以现在心里的想法是想传一组数列给设备
想用int[]去传 但看到read(write)似乎只有接受byte[]的传法
想请教该怎麽传int[]
另外在上面也附上程式码了
目前大概是最後的DataSendGet方法那边不清楚该怎麽做
感谢~
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 12:18:36
13F:推 zephyrhymn: 把out.writeUTF("我是Client");改成下面试试看 02/07 13:48
14F:推 zephyrhymn: byte[] bytes = "123".getBytes(); 02/07 13:52
15F:→ zephyrhymn: out.write(bytes); 02/07 13:52
16F:→ ssccg: 你贴的那个图传的就是byte[],为什麽你要传int[] ? 02/07 14:41
17F:→ ssccg: socket传资料都是以byte为单位,其他资料型态都是转为byte 02/07 14:44
18F:→ ssccg: int就是转成4个byte,DataOutputStream的writeInt可直接转 02/07 14:45
19F:→ ssccg: 真的要传五个int,可以呼叫五次writeInt,资料只会先暂存在 02/07 14:46
20F:→ ssccg: buffer里,到buffer满了或呼叫flush才会以封包的形式送出 02/07 14:48
喔喔 感谢两位大大
现在我程式码改成这样
https://imgur.com/S5Jbded.jpg
Server也有回应了....
但东西不是像我测试时是00 00
反而是2
是我传回来的值没转换对的型态吗
那是哪种型态啊
感谢
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 15:48:28
我後来的想法是 他回传2是告诉我设备回传了bytes[0],bytes[1]两个给我
而我要的是知道bytes[0],bytes[1]的值各是多少
因此我後来加上一段程式码让它里面的值转String show出来
但变成下面这样...
https://imgur.com/s2vCjHX.jpg
因为之前有宣告buff为byte[1024]的阵列
估计是跑出1024个0了...
刚好设备回传的值也是0
看不出来前两个这样算不算正确了哈哈
现在问题是
因为根据不同的指令 设备回传的值的长短也会不一
这边我该怎麽设计让它每次都是show给我刚刚好长度的值啊
感谢
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 16:20:48
後来我写了一个for回圈
想说既然in.read(...)那行跑出来是2
我宣告一个int = in.read(...)
在写个for回圈让它印出来
程式如下图
https://imgur.com/QfYmwnw.jpg
但没有任何东西跑出来欸
而且程式就当了...
有人知道怎麽回事吗
感谢
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 16:51:07
21F:→ ssccg: 自己依read的回传值取buffer中实际上是回传值的部分 02/07 16:53
22F:→ ssccg: 你要先检查那个值是否>=0,没有读到时会是-1 02/07 16:58
23F:→ ssccg: 然後回圈的index应该从0开始,< 长度 02/07 16:58
抱歉S大 有关於read那部分有点看不懂 所以我取回的是?
另外刚刚也有发现buff[i]设错了
後来把红框程式往上移就有东西出现了
但黄框的println却没跑出来...
如以下
https://imgur.com/UOnDocW.jpg
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 17:02:21
24F:→ ssccg: 你第一次在黄框就把socket里的东西读掉了,当然红框那边读 02/07 17:14
25F:→ ssccg: 不到东西,改过之後红框是正常的,然後读掉了当然黄框那边 02/07 17:15
26F:→ ssccg: 的read就没东西了,read只能读一次不能重覆读 02/07 17:18
喔喔~ 原来如此哈哈
抱歉竟然连这这麽基本的都不知道~
那s大想再向您请教 有关於如何检查是否>=0
我该把条件设在哪
因为我现在好像就遇到问题了...
现在回传给我的值都是负的...
抱歉又来叨扰各位了
昨天测试一笔新的组数
照理来说会跑出80 8C 如下图
https://imgur.com/Pj4sg4I.jpg
但发现跑出来是负数
https://imgur.com/FgFO5lF.jpg
想一想後觉得可能是转16进制的问题
因此转了後如下图
https://imgur.com/TkfXMhn.jpg
确实最後是我想要的
但今天只想取数值 前面的fffff不想取出
因此天真如我以为补数能帮我解决
但发现补数後的值完全跑掉了
https://imgur.com/c4wkV6j.jpg
想请教大家 我可以怎样取我想要的东西呢
感谢
※ 编辑: daniel098962 (61.216.92.108), 02/07/2018 18:11:30
※ 编辑: daniel098962 (61.216.92.108), 02/08/2018 10:12:43
27F:推 gmoz: 找一下网路上的SOCKET互传字串的范例吧 02/08 10:27
28F:→ gmoz: 完全看懂是怎麽传怎麽拿怎麽转的之後再回来写 02/08 10:30
29F:推 omidofor: 你的问题在於不了解Java基础型别代表的意义,以及不知道 02/08 12:31
30F:→ omidofor: 类别、方法上面的关键字代表什麽意思。 02/08 12:32
31F:→ omidofor: 建议你上网查资料或是找本书补一下基础的知识,不然这边 02/08 12:33
32F:→ omidofor: 讲一步动一步的方式对你完全没有帮助。最惨的是写出一个 02/08 12:33
33F:→ omidofor: 看似可以但充满臭虫的程式,不了解基础的你会完全无法找 02/08 12:34
34F:→ omidofor: 出问题所在并修正。 02/08 12:35
感谢各位的指教
这是真的 对於java的基础还是太多不了解
现在也是边从网路上寻找 也一边看书找有没有对应的资讯
但这专案算是近期需要完成
才会想来这边向大家求解或提供一个逻辑方向思考
感谢各位了~~~
※ 编辑: daniel098962 (61.216.92.108), 02/08/2018 13:15:58
最後也有成功让他跑出来了
感谢各位的帮忙~
https://imgur.com/RT4fWB2.jpg
※ 编辑: daniel098962 (61.216.92.108), 02/08/2018 13:55:51
35F:→ y3k: 如果Server端允许 我比较建议直接用Http.... 02/10 12:56
36F:→ y3k: 阿 不过作业还是用Socket喔XD 02/10 13:04