java中的socket是什么意思?

java中的socket是什么意思?,第1张

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。\x0d\以J2SDK-13为例,Socket和ServerSocket类库位于javanet包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例, *** 作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。\x0d\重要的Socket API:\x0d\javanetSocket继承于javalangObject,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-13文档。\x0d\ Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。\x0d\ getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。\x0d\ getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。\x0d\注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。\x0d\2ServerSocket类例子编辑\x0d\\x0d\package comlanbersocket;\x0d\import javaioDataInputStream;\x0d\import javaioDataOutputStream;\x0d\import javaioIOException;\x0d\import javanetServerSocket;\x0d\import javanetSocket;\x0d\public class ServerDemo {\x0d\/\x0d\ 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,\x0d\ 而后才可以向客户端发送信息,否则将会有运行时出错。\x0d\ @param args\x0d\/\x0d\public static void main(String[] args) {\x0d\ServerSocket ss = null;\x0d\try {\x0d\ss = new ServerSocket(8888);\x0d\//服务器接收到客户端的数据后,创建与此客户端对话的Socket\x0d\Socket socket = ssaccept();\x0d\//用于向客户端发送数据的输出流\x0d\DataOutputStream dos = new DataOutputStream(socketgetOutputStream());\x0d\//用于接收客户端发来的数据的输入流\x0d\DataInputStream dis = new DataInputStream(socketgetInputStream());\x0d\Systemoutprintln("服务器接收到客户端的连接请求:" + disreadUTF());\x0d\//服务器向客户端发送连接成功确认信息\x0d\doswriteUTF("接受连接请求,连接成功!");\x0d\//不需要继续使用此连接时,关闭连接\x0d\socketclose();\x0d\ssclose();\x0d\} catch (IOException e) {\x0d\eprintStackTrace();\x0d\}\x0d\}\x0d\}\x0d\\x0d\3客户端的例子编辑\x0d\package comlanbersocket;\x0d\importjavaioDataInputStream;\x0d\import javaioDataOutputStream;\x0d\importjavaioIOException;\x0d\import javaioOutputStream;\x0d\import javanetSocket;\x0d\import javanetUnknownHostException;\x0d\public class ClientDemo {\x0d\/\x0d\ @param args\x0d\/\x0d\public static void main(String[] args) {\x0d\Socket socket = null;\x0d\try {\x0d\socket = new Socket("localhost",8888);\x0d\//获取输出流,用于客户端向服务器端发送数据\x0d\DataOutputStream dos = new DataOutputStream(socketgetOutputStream());\x0d\//获取输入流,用于接收服务器端发送来的数据\x0d\DataInputStream dis = new DataInputStream(socketgetInputStream());\x0d\//客户端向服务器端发送数据\x0d\doswriteUTF("我是客户端,请求连接!");\x0d\//打印出从服务器端接收到的数据\x0d\Systemoutprintln(disreadUTF());\x0d\//不需要继续使用此连接时,记得关闭哦\x0d\socketclose();\x0d\} catch (UnknownHostException e) {\x0d\eprintStackTrace();\x0d\} catch (IOException e) {\x0d\eprintStackTrace();\x0d\}\x0d\}\x0d\}

打横杠是因为那个方法已经过时了现在已经不怎么用了。。。
Socket 服务器: 1先创建 ServerSocket ss = new ServerSocket(端口号)
2 接收请求 Socket s = ssaccept()
3接收消息 先读后写BufferedReader in = new BufferedReader(
new InputStreamReader(sgetInputStream(),"utf-8"));
String str = inreadLine(); PrintWriter out = new PrintWriter
( new BufferedWriter( new OutputStreamWriter(sgetOutputStream())),true);
outprintln("服务器信息");
4关闭流outclose();
inclose();
isclose();
客户端 1、通过IP地址和端口实例化Socket,请求连接服务器
2、获取Socket上的流以进行读写。
3、对流包装进BufferedReader/PrintWriters实例
4、关闭打开的流

Socket 和ServerSocke 是一对 他们是javanet下面实现socket通信的类
SocketChannel 和ServerSocketChannel是一对 他们是javanio下面实现通信的类 支持异步通信
服务器必须先建立ServerSocket或者ServerSocketChannel 来等待客户端的连接
客户端必须建立相对应的Socket或者SocketChannel来与服务器建立连接
服务器接受到客户端的连接受,再生成一个Socket或者SocketChannel与此客户端通信
不过Socket和SocketChannel可以通过 socketchannel() SocketChannelsocket() 方法相互转换
同理ServerSocket 和ServerSocketChannel 也可以相互转换

在 Java Socket 网络编程中,服务器使用 ServerSocket 来侦听传入的客户端连接。当客户端连接到服务器时,ServerSocket 会在服务器上创建一个新的套接字以与客户端通信,并为客户端提供新的输入流和输出流,分别用于读取和写入。ServerSocket 继续侦听新的传入客户端连接,并继续为每个连接的新客户端创建新的套接字和流。

我的方向有点和你不一样,但是关于socket的一般是差不多的,建议你找找socket流的知识
Socket内含输入,输出流,只需获取Socket的流对象,就可以对流进行读写 *** 作了。比如,若想向Socket的输出流写数据,只须另一方从自己的Socket的输入流中读取数据即可给你个例子吧,是模拟客户端和服务器端的数据交互
//客户端import javaioBufferedReader;import javaioInputStreamReader;import javaioPrintStream;import javanetSocket;
public class MyClent { public static void main(String[] args) { PrintStream ps = null; BufferedReader br = null; BufferedReader message = null; try { Socket scoket = new Socket("127001", 1254); ps = new PrintStream(scoketgetOutputStream()); br = new BufferedReader(new InputStreamReader(scoketgetInputStream())); message = new BufferedReader(new InputStreamReader(Systemin)); while(true){ psprintln("客户端向服务器发送的数据是:"+messagereadLine()); Systemoutprintln(brreadLine()); psflush(); } } catch (Exception e) { // TODO Auto-generated catch block eprintStackTrace(); } }}
//服务器端import javaioBufferedReader;import javaioInputStreamReader;import javaioPrintStream;import javanetServerSocket;import javanetSocket;
public class MyServer {
/ @param args / public static void main(String[] args) { // TODO Auto-generated method stub PrintStream ps = null; BufferedReader br = null; BufferedReader message = null; try { ServerSocket server = new ServerSocket(1254); Socket scoket = serveraccept();// new Test(scoket); ps = new PrintStream(scoketgetOutputStream()); br = new BufferedReader(new InputStreamReader(scoketgetInputStream())); message = new BufferedReader(new InputStreamReader(Systemin)); while(true){ Systemoutprintln(brreadLine()); psprintln("服务器向客户端发送的数据是:"+messagereadLine()); psflush(); } } catch (Exception e) { // TODO Auto-generated catch block eprintStackTrace(); } }
}</p></font></p>

package Server;
import javaio;
import javanet;
import messageMessageType;
//该线程用于和客服端进行通信,是一个线程类
public class ServerClientComunicationThread extends Thread{
Socket s=null;
ObjectInputStream ois=null;
MessageType mt=null;
ObjectOutputStream oos=null;
public ServerClientComunicationThread(Socket s){
thiss=s;
}
public void run(){
//不停地从socket里面读取数据
while(true){
try {
ois=new ObjectInputStream(sgetInputStream());
mt=(MessageType)oisreadObject();
Systemoutprintln("服务器读取到的信息");
Systemoutprintln(mtgetContent()+" "+mtgetGetter()+" "+
mtgetMessagetype()+mtgetSendTime());
//将读取到的数据转发给对应的客服端
Systemoutprintln("从集合里面可以找到用户压迫将数据发送给"+ ManageOnlineUserhmget(mtgetGetter()));
oos=new ObjectOutputStream(( ManageOnlineUserhmget(mtgetGetter()))getOutputStream());
ooswriteObject(mt);
} catch (Exception e) {
eprintStackTrace();
}
}
}
}

这个很简单啊。设置超时就可以了,当超过一定时间没有进行数据交换的话,会自动关闭的。或者写个监护线程,查看状态。socket还有一个方法叫isClose也可以进行判断。楼下的是sice5921:是2货来到的,来混分的楼主千万别给分他,像这种拉基进来一次检举一次,哪怕把问题关闭了也不给这种拉基分

因为服务器linux系统的/etc/profile里面的系统变量CLASSPATH需要改一下,就是需要定位到当前java文件所在的目录,把CLASSPATH改成了下面这样(其实就是加个 :):
CLASSPATH=:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/toolsjar


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13470987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-13
下一篇 2023-08-13

发表评论

登录后才能评论

评论列表(0条)

保存