套接字学习
- 什么是套接字?
- 计算机网络基础知识
- 基于套接字的网路编程案例?
什么是套接字?
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程
序通常通过"套接字"向网络发出请求或者应答网络请求。
套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的
套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套
接字有两种不同的类型:流套接字和数据报套接字。
计算机网络基础知识
什么是技术机网络:
通过有线/无线的链路连接多个计算机设备
进行数据通信或设备共享
标识:
物理: MAC 芯片(网卡/网络适配器/蓝牙/WIFI)
逻辑:IP地址
IP v4 2^32
IP v6 2^128
端口号:port
2^16 0~65535 65536
1024(已占用的端口数目)
http,ftp,ssh,pop,smtp,默认占用了端口(eg:80web端口)
网络通信中标识的网络服务
TCP/IP
应用层 HTTP/HTTPS/pop3/SMTP/SSH/FTP/自定义
传输层 TCP/UDP (套接字)
TCP 传输控制协议
UDP 用户数据报协议
网络层 IP协议
物理层/数据链路层
注意:
后面的博客将会写出TCP/IP学习分享
基于套接字的网路编程案例?
使用线程池实现客户端与服务器的通信,客户端给服务器发送一个字符串,服务器做反转后再发送给客户端.(下面给出一个简单的例子)
客户端程序:
package cn.csuft.poorguy.fileserver;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
*
* @author Bug研发工程师
*
*/
public class Client {
// 服务器端口
int port = 9000;
// 服务器地址
InetAddress address;
// 客户端TCP套接字
Socket socket;
public Client() {
try {
address = InetAddress.getByName("127.0.0.1");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
socket = new Socket(address, port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void start() {
// 先发送
// 再接受字符传反转或变成大写再发送回来
// 服务端实现反转再发回去
// 服务器将小写
try (OutputStream out = socket.getOutputStream()) {
String s = "hello";
out.write(s.getBytes());
out.flush();
InputStream in = socket.getInputStream();
byte[] buf = new byte[128];
int size = in.read(buf);
// String now = new String(buf, 0, size);
// System.out.println("当前时间: " + now);
String s_reverse = new String(buf, 0, size);
System.out.println("转置的结果是: " + s_reverse);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client();
Client client1 = new Client();
Client client2 = new Client();
client.start();
client1.start();
client2.start();
}
}
服务器端程序:
package cn.csuft.poorguy.fileserver;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 文件服务器(Server)
* 软件:提供服务(对(客户端)请求提供相应)的程序
* @author Bug研发工程师
*
*/
public class FileServer {
//地址
//IP
InetAddress address;
//Port 端口
int port = 9000;
//套接字
//Socket socket
ServerSocket serverSocket;
ExecutorService pool;
public FileServer() {
try {
address = InetAddress.getByName("127.0.0.1");
// for(InetAddress ads : InetAddress.getAllByName("www.baidu.com")) {
// System.out.println(ads.getHostAddress());
// }
} catch (UnknownHostException e) {
e.printStackTrace();
}
//创建服务端套接字
//在当前主机
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
FileServer server = new FileServer();
server.start();
}
public void start() {
pool = Executors.newCachedThreadPool();
//接受客户端的请求
System.out.println("服务器启动...");
while(true) {
try {
Socket s = serverSocket.accept();
pool.execute(new TimeService(s));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
多线程程序:
package cn.csuft.poorguy.fileserver;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Date;
public class TimeService implements Runnable{
Socket socket;
public TimeService() {
}
public TimeService(Socket socket) {
this.socket = socket;
}
/**
* 字符串转置
* @param s
* @return
*/
private String reverse(String s) {
char []arr = s.toCharArray();
int limit = arr.length-1;
int middle = arr.length>>1;
for(int i=0;i<middle;i++) {
char temp = arr[i];
arr[i] = arr[limit-i];
arr[limit-i] = temp;
}
System.out.println(new String(arr));
return new String(arr);
}
@Override
public void run() {
String now = new Date().toLocaleString();
System.out.println(Thread.currentThread().getName()+"处理"+socket.getPort());
try (OutputStream out = socket.getOutputStream()){
InputStream in = socket.getInputStream();
byte []buf = new byte[1024];
int size = in.read(buf);
String s = new String(buf,0,size);
s = reverse(s);
out.write(s.getBytes());
out.flush();
//out.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
上面是简单的套接字使用的程序,如果有问题请指出,谢谢