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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)