学习Socket需要了解的几个概念:
Socket 指的是互联网连接中的各个终结点。互联网连接是怎么创建的,通过IP地址加端口号,进行互通。
A电脑(192.168.3.125:80)》》》》B电脑(192.168.3.111:80) 那么这一个个的Ip地址+端口号就是一个Socket(套接字。)
Http协议:两台互联网的通讯需要遵守统一的应用层协议,通常指Http协议。应用层协议还有FTP协议,SMPT简单邮件协议等。
底层协议:IP/TCP协议。除了http需要遵守,还需要遵守IP/TCP协议。
URL: 应用层协议+IP地址+端口号+资源路径 例如 http://www.baidu.com/index.html; (http协议默认遵守的端口号为80) 文件传输默认为21 远程登录Telnet 23
Java中提供的支持Socket操作的几个常用类:
InetAddress :就是表示IP地址啦,没有构造函数。可以用过静态方法InetAddress.getLocalhost()等方法来或者本机的InetAddress对象。toString方法就是打印IP地址。其他方法请参见api文档。
URL: 资源对象。 就是上面所说的URL对象。
Socket:send方法,getOutPutStream() getInputStream()等
DatagramSocket:数据包,UDP传输保存数据的类。
IP/TCP传输:有序,规则,稳定安全。但速度较慢。
服务端:
package tcp_ip;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* tcp/ip传输 服务器端
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器端socket
ServerSocket serverSocket = new ServerSocket(9999);
//创建指定端口的serverSocket后 设置监听状态! 会阻塞
System.out.println("socket服务端启动成功!正在监听9999端口......");
Socket socket = serverSocket.accept();
//成功接收到请求后会返回一个socket
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
String data = reader.readLine();
while(data!=null&&!data.equals("")){
System.out.println(data);
data=reader.readLine();
}
reader.close();
isr.close();
is.close();
socket.close();
}
}
客户端:
package tcp_ip;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
//创建client客户端指定目标ip及端口 (即目标socket)
Socket socket = new Socket("localhost", 9999);
//或者这个socket的输出流
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端!");
writer.close();
outputStream.close();
socket.close();
}
}
//多线程版本:
服务端:
package tcp_ip;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerThread {
public static void main(String[] args) throws IOException {
//创建服务器端socket
ServerSocket serverSocket = new ServerSocket(9999);
//创建指定端口的serverSocket后 设置监听状态! 会阻塞
System.out.println("socket服务端启动成功!正在监听9999端口......");
while(true){
Socket socket = serverSocket.accept();
new RunThread(socket).start();
}
}
}
客户端:
package tcp_ip;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
//创建client客户端指定目标ip及端口 (即目标socket)
Socket socket = new Socket("localhost", 9999);
//或者这个socket的输出流
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端! 又给你发啦~~");
writer.close();
outputStream.close();
socket.close();
}
}
UDP传输:无序,不规则,不安全,速度快。
服务端:
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* udp客户端
* @author Czt
*
*/
public class Client {
public static void main(String[] args) {
try {
String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8");
DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788);
DatagramSocket socket = new DatagramSocket();
socket.send(datagramPacket);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* udp客户端
* @author Czt
*
*/
public class Client {
public static void main(String[] args) {
try {
String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8");
DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788);
DatagramSocket socket = new DatagramSocket();
socket.send(datagramPacket);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}