javasocket线程
㈠ java socket 线程
以前写过一个简单的远程控制软件(命令行控制,就是在本机发个命令,在远程机器执行),用的即使Socket,代码找不到了,但原理很简单。就是自己定义一个简单协议,简单点就用Java序列化,封一个自定义命令对象,每次发一个对象过去,对方接受后,执行命令对象就是了。
下面发一个间的JavaSocket例子:
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassJavaXmlSocket{
/**
*@paramargs
*@throwsIOException
*@throwsClassNotFoundException
*/
publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{
//TODOAuto-generatedmethodstub
finalServerSocketss=newServerSocket(32788);//创建服务端
newThread(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
Sockets2=ss.accept();
ObjectOutputStreamoutput_s2;
ObjectInputStreaminput_s2;
output_s2=newObjectOutputStream(s2.getOutputStream());//服务端输出流
input_s2=newObjectInputStream(s2.getInputStream());//服务端输入流
//服务端向客户端发送消息
output_s2.writeObject("hello");
Stringstr=(String)input_s2.readObject();
System.out.println("服务端接收端客户端发送的消息:"+str);
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}.start();//启动一个线程服务端侦听客户端连接
newThread(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
Sockets1=newSocket("127.0.0.1",32788);//创建客户端,注册并绑定ServerSocket
ObjectOutputStreamoutput_s1;
ObjectInputStreaminput_s1;
output_s1=newObjectOutputStream(s1.getOutputStream());//客户端输出流
input_s1=newObjectInputStream(s1.getInputStream());//客户端输入流
//客户端向服务端发送消息
output_s1.writeObject("hello");
Stringstr2=(String)input_s1.readObject();
System.out.println("客户端接收端服务端发送的消息:"+str2);
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}.start();////启动一个线程客户端端连接服务端
try{
//如果你保证Main方法不会退出,就不需要这个延时。
Thread.sleep(5000);//延时5秒等待消息处理结束关闭服务端。
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
//关闭服务
ss.close();
}
}
㈡ java socket服务器端线程卡死
对于socket通信的操作,不要放在主线程,另开一个子线程,顺便一说,accept这个方法是堵塞的,在没有收到消息的情况下会一直堵塞在那里,所以如果你客户端没发送数据给服务端,那么基本服务端所在那条线程会停滞在那个方法,估计就这原因让你的程序看起来是卡死的,所以咯,别把通信的操作写在主线程,要写在子线程
㈢ java一个Socket连接多线程是否能操作两个读取流
可以啊 ,不过需要新建两个实现Runnable 借口的类,重写run方法,一个实现读取,另一个实现输出的功能。再用两条线程分别操作这两个方法。
㈣ java多线程socket通信原理是什么
第一,程序是通过分时进行服务的。就是说一个程序监听一个端口,第一秒可以从别的地方来一个包,第二秒可以从另一个地方来一个包。
第二,每个socket都会有包发送来的ip地址和端口号,服务器向这个ip对应机器的端口发送数据以回应对方。
㈤ java socket 如何使输入输出流分别在不同线程工作
你这个问题我读的不是很懂
Socket连接到ServerSocket后会返回一个Socket对象给服务器,服务器就通过这个Socket对象和客
户端的Socket进行沟通,通过输入输出流取得和发送消息,我用到的对象有InputStream、
OutputStream(通过Socket的get****Stream获得输入输出流),ObjectOutputStream、
ObjectInputStream(用于发送和接收一个对象)
接收端:肯定要开一个线程独立运行,才能达到发送和接收消息互不干扰
发送端:即一个方法,需要发送东西时调用,函数带个发送的对象作为参数
大概就这些吧,希望能帮到你
㈥ java socket多线程的问题可以多个线程使用同一个socket吗
可以写个demo试一下啊,应该是可以的,socket接收到的消息只能被其中一个线程接收。线程1 和2 接受到的肯定不是同一个消息。会有先后之分。看你怎么控制。比如从接收的消息是ABCD,那么这相当于一个资源。线程1和2在这里拿消息,拿到之后,socket里面就少了,比如线程1拿到AB,线程2拿到CD
㈦ Java多线程Socket的关闭问题
创建一个新线程时将这个线程对象的引用赋给一个变量:
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start();
thread2.start();
在你的线程类中应该提供一个方法,用于关闭这个线程所创建的socket连接。例如你的MyThread类中应该提供一个关闭socket的方法:
public void closeSocket()
{
//这里关闭当前对象的socket
}
这样,如果你想关闭thread1中的连接(该连接使用8888端口),则只要调用这个方法:
thread1.closeSocket();
㈧ 关于 java socket的消息推送问题
关于 java socket的消息推送问题,首先:开启服务端,并暴露出端口。然后通过一个while的死循环去不停的接收来自客户端的socket,并且通过一个ArrayList来维护。并且通过子线程去对list中的socket进行操作。其次:客户端去访问服务器的端口。开启一个子线程去不停的接收来自服务端的消息。
然而关于推送服务的更多内容,可以通过深圳极光公司了解一下。深圳市和讯华谷信息技术有限公司(极光 Aurora Mobile)成立于2011年,是中国领先的开发者服务提供商,专注于为开发者提供稳定高效的消息推送、一键认证以及流量变现等服务,助力开发者的运营、增长与变现。
同时,极光的行业应用已经拓展至市场洞察、金融风控与商业地理服务,助力各行各业优化决策、提升效率。