所以又频繁的数据收发的话。短连接会频繁创建TCP连接,而对于长连接。则始终用的是同一个TCP连接
package com.tree.demo.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
private static final int PORT = 1234;
private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket ss = new ServerSocket(PORT);
Socket s = ss.accept();
System.out.println("这是服务端,监听本机"+PORT+"端口");
byte[] recData = null;
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
while(true) {
recData = new byte[BUFFER_SIZE];
int r = in.read(recData);
//int r = in.read(recData);
if(r>-1) {
String data = new String(recData);
if(data.trim().equals("over")) {
s.close();
}
System.out.println("读取到client发送的来数据:"+data);
out.write("这是服务端发给client的数据:".getBytes());
out.write(recData);
}else {
System.out.println("数据读取完成。");
s.close();
System.exit(0);
//ss.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上这样的服务端读数据是堵塞式。假设client没有数据写过来。服务端就会一直堵塞在那不动
client开启一个telnet就可以測试服务端的socket程序了,当然你也能够自己写一个socketclient,例如以下:
package socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientSocketDemo {
private static final String HOST = "192.168.8.14";
private static final int PORT = 1234;
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket client = new Socket(HOST, PORT);
OutputStream out = client.getOutputStream();
try {
while (true) {
Thread.sleep(1000);
System.out.println("发送心跳数据包");
out.write("send heart beat data package !".getBytes());
}
} catch (Exception e) {
e.printStackTrace();
out.close();
client.close();
}
}
}
同一时候这要是一个心跳的实例。心跳仅仅要不出现异常的情况下,能够直接使用client连接发送数据包,不须要new socket新建连接了。
accept()等待连接,该方法堵塞当前线程直到建立连接为止
以上服务端的网络程序仅仅能和一个client程序连接,拒绝多个client的连接。
我们能够通过线程来解决问题:每当程序建立一个新的套接字连接。也就是调用accept方法时。将启动一个新的线程来处理server和client的连接。而主程序将马上返回并等待下一个连接。
简单解释就是:
短连接:建立连接,发送数据包。关闭连接
长连接:建立连接。发送数据包,发送心跳包,发送数据包,发送心跳包。发送心跳包。
。。。。。
所以又频繁的数据收发的话。短连接会频繁创建TCP连接,而对于长连接。则始终用的是同一个TCP连接
package com.tree.demo.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
private static final int PORT = 1234;
private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket ss = new ServerSocket(PORT);
Socket s = ss.accept();
System.out.println("这是服务端,监听本机"+PORT+"端口");
byte[] recData = null;
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
while(true) {
recData = new byte[BUFFER_SIZE];
int r = in.read(recData);
//int r = in.read(recData);
if(r>-1) {
String data = new String(recData);
if(data.trim().equals("over")) {
s.close();
}
System.out.println("读取到client发送的来数据:"+data);
out.write("这是服务端发给client的数据:".getBytes());
out.write(recData);
}else {
System.out.println("数据读取完成。");
s.close();
System.exit(0);
//ss.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上这样的服务端读数据是堵塞式。假设client没有数据写过来。服务端就会一直堵塞在那不动
client开启一个telnet就可以測试服务端的socket程序了,当然你也能够自己写一个socketclient,例如以下:
package socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientSocketDemo {
private static final String HOST = "192.168.8.14";
private static final int PORT = 1234;
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket client = new Socket(HOST, PORT);
OutputStream out = client.getOutputStream();
try {
while (true) {
Thread.sleep(1000);
System.out.println("发送心跳数据包");
out.write("send heart beat data package !".getBytes());
}
} catch (Exception e) {
e.printStackTrace();
out.close();
client.close();
}
}
}
同一时候这要是一个心跳的实例。心跳仅仅要不出现异常的情况下,能够直接使用client连接发送数据包,不须要new socket新建连接了。
accept()等待连接,该方法堵塞当前线程直到建立连接为止
以上服务端的网络程序仅仅能和一个client程序连接,拒绝多个client的连接。
我们能够通过线程来解决问题:每当程序建立一个新的套接字连接。也就是调用accept方法时。将启动一个新的线程来处理server和client的连接。而主程序将马上返回并等待下一个连接。