求助啊,大牛们!IP,端口,Socket,给我讲下

n_e_e_d 2013-06-20 04:21:02
现在有一个端口,有一个IP,还有一些报文的格式介绍。现在想问几个问题,请各位大牛给指点下:

我是客户端,我要是通过这个IP和端口和服务器端联系,是不是要使用Socket通信呢?还有没有别的方法呢?
你们可以给我提供一些Socket通信的源码吗?最好有注释的!连接也可以!现在对Socket是一点都不知道呀!
要怎么通信的呢?

还有使用Socket如何向服务器端发送信息呢?我现在的信息就是报文形式的!报文要如何处理使用起来会方便点呢?给服务端发送信息后,他给我返回的也是报文的形式,要如何解析呢?
...全文
215 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
n_e_e_d 2013-07-02
  • 打赏
  • 举报
回复
引用 26 楼 oh_Maxy 的回复:
Socket用的不多,写了一个如何保持长连接的类(比较糙,凑合看吧):

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;


public class SocketManager
{

    private Socket socket = null;

    //socket初始化方法
    public SocketManager() throws UnknownHostException, IOException
    {
        //这里如果出现异常,socket还是会有问题,建议在外层调用
        if (null == socket || socket.isClosed())
        {
            socket = new Socket("10.137.28.189", 8888);
        }
    }

    //socket关闭
    public void closeSocket()
    {
        if (null == socket || socket.isClosed())
        {
            return;
        }

        try
        {
            socket.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    //只提供getter方法
    public Socket getSocket()
    {
        return socket;
    }
}
每个请求线程,都初始化一个SocketManager实例。使用连接时,get即可,不要对其close操作,直到不想保存此连接,就closeSocket
恩恩,谢谢你!
oh_Maxy 2013-07-02
  • 打赏
  • 举报
回复
Socket用的不多,写了一个如何保持长连接的类(比较糙,凑合看吧):

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;


public class SocketManager
{

    private Socket socket = null;

    //socket初始化方法
    public SocketManager() throws UnknownHostException, IOException
    {
        //这里如果出现异常,socket还是会有问题,建议在外层调用
        if (null == socket || socket.isClosed())
        {
            socket = new Socket("10.137.28.189", 8888);
        }
    }

    //socket关闭
    public void closeSocket()
    {
        if (null == socket || socket.isClosed())
        {
            return;
        }

        try
        {
            socket.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    //只提供getter方法
    public Socket getSocket()
    {
        return socket;
    }
}
每个请求线程,都初始化一个SocketManager实例。使用连接时,get即可,不要对其close操作,直到不想保存此连接,就closeSocket
n_e_e_d 2013-07-02
  • 打赏
  • 举报
回复
引用 24 楼 oh_Maxy 的回复:
3.1 登录流程(连接后) --发送过来的报文带上用户登录信息;登录成功,在服务器也记录一个成功登录的账号信息;服务器收到的任何一个消息,都校验其登录信息是否合法,是否已登录,来判断是否丢弃此消息。 3.2 业务流程(成功登录后) --这个可以将客户端作为Thread的子类,每次请求,都new一个客户端线程类处理。对于服务端主动发送过来的消息的处理,可以考虑做一个专门的线程,监控服务端主动发送的消息(此时可以将服务端当做客户端,客户端当服务端) 3.3 异常流程 --服务端做个时间计数器,超时就将用户登录信息注销;客户端的每次请求操作,都将该时间计数器清零。 以上只是一些建议,我也没有具体实现的代码,需要楼主查资料实现啦!LZ可以选择性的参考一下,最好根据实际情况分析是否可行。 另外,别您啊您的,别扭啊,呵呵~
打字习惯了,我会注意下的! 现在正在查找一些资料呢!我现在是客户端,我要和服务端通信的。就目前看得资料来说感觉要用到socket的长连接,但是我发现很多都把长连接指向了服务端,按我的意思理解的是长连接就是客户端和服务端建立连接后,在发送完数据以后不会立即关闭连接,而是通过心跳报文保持连接的,目前的困惑就是在客户端要如何建立一个长连接呢,我都是写一个socket连接后一发送数据再一接收最后不都关闭socket了吗?要如何保持他是一直开着呢!还有我向服务端发送数据以后,接收服务端给我发来的信息的时候,可以读取到,但是他却一直卡在读取数据那一步了,就走不到下面的代码了!
oh_Maxy 2013-07-02
  • 打赏
  • 举报
回复
3.1 登录流程(连接后) --发送过来的报文带上用户登录信息;登录成功,在服务器也记录一个成功登录的账号信息;服务器收到的任何一个消息,都校验其登录信息是否合法,是否已登录,来判断是否丢弃此消息。 3.2 业务流程(成功登录后) --这个可以将客户端作为Thread的子类,每次请求,都new一个客户端线程类处理。对于服务端主动发送过来的消息的处理,可以考虑做一个专门的线程,监控服务端主动发送的消息(此时可以将服务端当做客户端,客户端当服务端) 3.3 异常流程 --服务端做个时间计数器,超时就将用户登录信息注销;客户端的每次请求操作,都将该时间计数器清零。 以上只是一些建议,我也没有具体实现的代码,需要楼主查资料实现啦!LZ可以选择性的参考一下,最好根据实际情况分析是否可行。 另外,别您啊您的,别扭啊,呵呵~
n_e_e_d 2013-07-02
  • 打赏
  • 举报
回复
引用 19 楼 oh_Maxy 的回复:
[quote=引用 18 楼 n_e_e_d 的回复:] [quote=引用 11 楼 oh_Maxy 的回复:] 嗯,服务端怎么实现的呢?能否安你说的,封装到Request里,当做一个字符串传给他? 感觉服务端应该会提供一个调用的方法的吧?
您好:我想请问一下就是我在客户端如何实现和服务端的通信呢? 现在要用到Socket的长连接,我在服务端要实现这个长连接呢?还有就是我如何使用俩个线程呢,一个是读取服务端返回的数据,一个是向服务端发送数据!方便的话,可以加下您的QQ吗?[/quote] 我们用的是SOAP协议,不过任何服务器,都应该接收响应后,会有一个返回消息的,这里不需要启动两个线程,同一个线程发送消息,再处理返回的响应就可以了吧。 QQ不怎么上的(白天也上不了),在你的CSDN空间给你留言了。[/quote] 上面21楼有我在客户端和服务端的交互流程,您给看下,要怎么处理这个发送和接收的问题呢!
n_e_e_d 2013-07-02
  • 打赏
  • 举报
回复
引用 19 楼 oh_Maxy 的回复:
[quote=引用 18 楼 n_e_e_d 的回复:] [quote=引用 11 楼 oh_Maxy 的回复:] 嗯,服务端怎么实现的呢?能否安你说的,封装到Request里,当做一个字符串传给他? 感觉服务端应该会提供一个调用的方法的吧?
您好:我想请问一下就是我在客户端如何实现和服务端的通信呢? 现在要用到Socket的长连接,我在服务端要实现这个长连接呢?还有就是我如何使用俩个线程呢,一个是读取服务端返回的数据,一个是向服务端发送数据!方便的话,可以加下您的QQ吗?[/quote] 我们用的是SOAP协议,不过任何服务器,都应该接收响应后,会有一个返回消息的,这里不需要启动两个线程,同一个线程发送消息,再处理返回的响应就可以了吧。 QQ不怎么上的(白天也上不了),在你的CSDN空间给你留言了。[/quote] 我已经加您QQ了,完了有时间同意下哈!
n_e_e_d 2013-07-02
  • 打赏
  • 举报
回复
引用 20 楼 fortheother 的回复:
如果需要把你计算机上的一些报文发送到例外一台计算机。 那么你需要一个发送程序,而接受计算机需要一个接收程序。 对于发送端来说,你需要知道对面的IP和端口即可进行发送,对于接收端来说,你只需要接收就OK了。 至于报文什么的。 不管是什么,直接用一个字符串或者字节数组打包发过去即可。(字节流) 至于如何解析,那是接受者的工作了,不属于网络传输的事情。
3.1 登录流程(连接后) 客户端连接服务器后,立刻发送登录报文并等待应答。在登录报文前发送的任何报文都将被服务器丢弃。 如果登录失败,客户端将收到带有错误码的登录应答报文,随后服务器会直接切断连接。 如果登录成功,客户端将收到带有成功信息的登录应答报文。此后客户端可以开始发送短消息报文并接受应答。 3.2 业务流程(成功登录后) 在登录成功后,客户端可以随时发送协议中定义的任何报文到服务器,服务器在处理后会回复应答报文给客户端。 在必要时,服务器也会主动发送报文给客户端,客户端收到报文后应回复应答报文。 上述流程是异步的,即一方如有多条报文要发送,可一口气发送所有报文,然后再逐条接收应答,而不必每发送一条报文都等待应答后才发送下一条。 3.3 异常流程 一旦客户端连接到服务器,无论是否已经登录,都需要每隔一定时间向服务器发送心跳报文,服务器收到后会返回心跳应答报文。这个时间的长度由服务器端预先确定。 如果一个客户端-服务器连接中,客户端持续没有发送任何报文到服务器的时间长度超过上述时间,服务器会判定为客户端已掉线,并切断连接。客户端需要重新连接并登录才能继续和服务器交互。 您好,上面这个是说的客户端和服务端的交互流程,现在的问题就是接收服务端返回的报文的问题,我是按照发送一个报文后就接收他的返回值,这样的话按照他的登录流程显然是不可以的。因为我这样写的时候,只能接收到登录后返回的登录报文,然后他就一直卡在接收报文的这一步了!别的都走不到了!
2013-07-01
  • 打赏
  • 举报
回复
如果需要把你计算机上的一些报文发送到例外一台计算机。 那么你需要一个发送程序,而接受计算机需要一个接收程序。 对于发送端来说,你需要知道对面的IP和端口即可进行发送,对于接收端来说,你只需要接收就OK了。 至于报文什么的。 不管是什么,直接用一个字符串或者字节数组打包发过去即可。(字节流) 至于如何解析,那是接受者的工作了,不属于网络传输的事情。
oh_Maxy 2013-07-01
  • 打赏
  • 举报
回复
引用 18 楼 n_e_e_d 的回复:
[quote=引用 11 楼 oh_Maxy 的回复:] 嗯,服务端怎么实现的呢?能否安你说的,封装到Request里,当做一个字符串传给他? 感觉服务端应该会提供一个调用的方法的吧?
您好:我想请问一下就是我在客户端如何实现和服务端的通信呢? 现在要用到Socket的长连接,我在服务端要实现这个长连接呢?还有就是我如何使用俩个线程呢,一个是读取服务端返回的数据,一个是向服务端发送数据!方便的话,可以加下您的QQ吗?[/quote] 我们用的是SOAP协议,不过任何服务器,都应该接收响应后,会有一个返回消息的,这里不需要启动两个线程,同一个线程发送消息,再处理返回的响应就可以了吧。 QQ不怎么上的(白天也上不了),在你的CSDN空间给你留言了。
n_e_e_d 2013-07-01
  • 打赏
  • 举报
回复
引用 11 楼 oh_Maxy 的回复:
嗯,服务端怎么实现的呢?能否安你说的,封装到Request里,当做一个字符串传给他? 感觉服务端应该会提供一个调用的方法的吧?
您好:我想请问一下就是我在客户端如何实现和服务端的通信呢? 现在要用到Socket的长连接,我在服务端要实现这个长连接呢?还有就是我如何使用俩个线程呢,一个是读取服务端返回的数据,一个是向服务端发送数据!方便的话,可以加下您的QQ吗?
oh_Maxy 2013-06-21
  • 打赏
  • 举报
回复
嗯,服务端怎么实现的呢?能否安你说的,封装到Request里,当做一个字符串传给他? 感觉服务端应该会提供一个调用的方法的吧?
n_e_e_d 2013-06-21
  • 打赏
  • 举报
回复
引用 8 楼 oh_Maxy 的回复:
引用 5 楼 n_e_e_d 的回复:
就这样的,分报头,正文体和报尾,然后是每几个字段代表一种属性,这属于字符流还是字节流,要如何处理呢?麻烦给说下,谢谢! [quote=引用 4 楼 weilus 的回复:] 报文什么格式啊,听说过XML,json,字符流,字节流。真心的孤陋寡闻了,同求这个神马格式啊?
这个报文怎么来的,真没见过。。[/quote] 我在使用Socket通信的时候向服务器端传送的信息就是这个报文是吗?虽然感觉是,但是总感觉不太确定!可以给我一个肯定的答案吗? 我是这样理解的,不知道对不对: 就是报文就相当于一个字符串。就好像我写一个方法要传一个参数,这个参数就是这个报文。至于报文的处理就是对这个字符串的处理了。是吗?谢谢帮助!
n_e_e_d 2013-06-21
  • 打赏
  • 举报
回复
引用 8 楼 oh_Maxy 的回复:
引用 5 楼 n_e_e_d 的回复:
就这样的,分报头,正文体和报尾,然后是每几个字段代表一种属性,这属于字符流还是字节流,要如何处理呢?麻烦给说下,谢谢! [quote=引用 4 楼 weilus 的回复:] 报文什么格式啊,听说过XML,json,字符流,字节流。真心的孤陋寡闻了,同求这个神马格式啊?
这个报文怎么来的,真没见过。。[/quote] 这是他们自定义的格式!
oh_Maxy 2013-06-21
  • 打赏
  • 举报
回复
引用 5 楼 n_e_e_d 的回复:
就这样的,分报头,正文体和报尾,然后是每几个字段代表一种属性,这属于字符流还是字节流,要如何处理呢?麻烦给说下,谢谢!
引用 4 楼 weilus 的回复:
报文什么格式啊,听说过XML,json,字符流,字节流。真心的孤陋寡闻了,同求这个神马格式啊?
这个报文怎么来的,真没见过。。
xieyongcx 2013-06-21
  • 打赏
  • 举报
回复
引用 6 楼 n_e_e_d 的回复:
[quote=引用 3 楼 xieyongcx 的回复:] 不好意思,我没有研究过哪方面。你继续研究把。
好吧,谢谢你![/quote]好把,给分我把。
weilus 2013-06-21
  • 打赏
  • 举报
回复
这个自定义协议的,什么格式,怎么解码之类的问下server端啊,二次开发也得搞清楚那边怎么定的协议啊
n_e_e_d 2013-06-21
  • 打赏
  • 举报
回复
引用 3 楼 xieyongcx 的回复:
不好意思,我没有研究过哪方面。你继续研究把。
好吧,谢谢你!
n_e_e_d 2013-06-21
  • 打赏
  • 举报
回复

就这样的,分报头,正文体和报尾,然后是每几个字段代表一种属性,这属于字符流还是字节流,要如何处理呢?麻烦给说下,谢谢!

引用 4 楼 weilus 的回复:
报文什么格式啊,听说过XML,json,字符流,字节流。真心的孤陋寡闻了,同求这个神马格式啊?
火影之贺 2013-06-21
  • 打赏
  • 举报
回复
Socket的例子很多,网上找个随便调试一下就行了。 接收到报文之后,首先统一以字符处理。然后根据标志位, 标志位是字符,继续以字符方式处理; 标志位是字节,就用字节方式处理,会用到byte相关的。
fafa 2013-06-21
  • 打赏
  • 举报
回复
试一下用hession的方式开接口,然后把你那所谓的报头转换成JSON进行传递。
加载更多回复(7)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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