一.网络Socket通信可以分为两种:
1.TCP/IP通信
2.UDP/IP通信
二.TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送。可以保证从一端数据传至连接的另一端时,数据能够确实送达。
三.UDP协议无连接通信协议,不保证可靠数据的传输,但能够同时向若干目标发送数据。UDP协议适合于一些对数据准确性要求不高的场合。
四.针对Socket通信简要介绍一个例子:(PS:只是对Socket通信的一个简单应用,不喜勿喷,欢迎提出意见!)
这个例子我采用到了线程,线程同步来编写;
首先,先创建一个服务器端:先创建ServerSocket对象来存储通信时的端口号;
接着创建Socket来监听服务器的端口,并且通过InputStream来得到传送过来的数据;
由于我采用的是线程来运行通信,所以如果传递过来的数据为空的时候,说明客户端没有发送数据,所以将客户端启动,并且将服务器端挂起。(要注意必须先激活客户端,才挂起服务器,否则当你挂起服务器之后,然后启动线程,系统会自动把服务器线程给开启。);如果数据不为空,那么将数据输出,然后创建一个输出流对象,方便我们可以从控制台输入数据。接着我用了一个判断,判断输入的数据是不是字符0,如果是就结束该线程。接着将数据写入,发送,关闭以上的所有操作对象。
public class Server implements Runnable{
private static Integer o = 1;
@Override
public void run() {
synchronized (o) {
while(true){
try {
ServerSocket ss = new ServerSocket(8888);
Socket s = ss.accept();
InputStream in = s.getInputStream();
byte [] data = new byte[1024];
in.read(data);
if(data.equals("")){
o.notify();
try {
o.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
String str = new String(data);
System.out.println("服务器收到的信息是: " + str);
OutputStream out = s.getOutputStream();
Scanner sin = new Scanner(System.in);
String si = sin.nextLine();
while(si.equals("0")){
Thread.currentThread().stop();
}
out.write(si.getBytes());
out.flush();
out.close();
in.close();
s.close();
ss.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
接着是客户端的介绍:
第一步,创建一个Socket对象来存储需要进行交流的IP地址和通信的端口号;
接着创建一个输出流对象用来写入数据;
后面的代码和服务器端的代码同理。
public class Client implements Runnable{
private static Integer o = 1;
@Override
public void run() {
while(true){
synchronized (o) {
try {
Socket socket = new Socket("192.168.2.101", 8888);
OutputStream out = socket.getOutputStream();
Scanner sin = new Scanner(System.in);
String string = sin.nextLine();
out.write(string.getBytes());
out.flush();
InputStream in = socket.getInputStream();
byte [] data = new byte[1024];
in.read(data);
if(data.equals("")){
o.notify();
o.wait();
}else{
String string2 = new String(data);
System.out.println("客户端接收到的信息是: " + string2);
in.close();
out.close();
socket.close();
}
} catch (Exception e) {
}
}
}
}
}
然后是主函数的调用了:
在这里调用的时候需要特别注意:需要先启动服务器线程(所以我先把客户端线程给屏蔽了)
public class Test {
public static void main(String[] args) {
Server server = new Server();
Client client = new Client();
Thread thread = new Thread(server);
Thread thread2 = new Thread(client);
thread.start();
// thread2.start();
}
}
然后启动客户端线程:
public class Test {
public static void main(String[] args) {
Server server = new Server();
Client client = new Client();
Thread thread = new Thread(server);
Thread thread2 = new Thread(client);
// thread.start();
thread2.start();
}
}
由以上可知我们开启了两个线程,此时系统运行了两个java文件,控制台截图:
按下回车键之后会自动跳转到以下截图:
可以继续输入
接着客户端会出现:
欢迎各位点评指导!!!