Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制
通信链路的端点就被称为“套接字”(英文名Socket)是提供给应用程序的接口
用来实现双向安全连接网络通信
进行网络通信时,Socket需要借助数据流来完成数据的传递工作


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建通信链路的端点客户端套接字
socket = new Socket("127.0.0.1", 8888);
//获取输出流将数据发送出去
os = socket.getOutputStream();
String str = "用户名:zhangsan 密码:123456";
os.write(str.getBytes());
System.out.println("我是客户端,我将数据发送完毕");
//关闭通道
socket.shutdownOutput();
//客户端需要通过输入流读取服务器端发送过来的消息
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
String result = br.readLine();
System.out.println("我是客户端,接收到的服务器端响应信息为:"+result);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket ss= null;
Socket socket = null;
InputStream is = null;
BufferedReader br = null;
OutputStream os = null;
try {
//创建服务器端套接字ServerSocket
ss= new ServerSocket(8888);
//服务器通过调用侦听方法来获取客户端的请求
socket = ss.accept();
//通过返回的Socket对象调用方法获取一个输入流来读取客户端发送过来的消息
is = socket.getInputStream();
//通过输入流读取客户端发送的消息
br = new BufferedReader(new InputStreamReader(is));
String str = br.readLine();
System.out.println("我这边是服务器:客户端发送给我的数据是:"+str);
//关闭通道
socket.shutdownInput();
//服务器接收客户端消息后,需要给客户端一个响应信息
os = socket.getOutputStream();
String result = "用户名和密码正确,可以登录";
os.write(result.getBytes());
System.out.println("给客户端的响应信息发送成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
os.close();
br.close();
is.close();
socket.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
传递对象信息

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket ss= null;
Socket socket = null;
InputStream is = null;
ObjectInputStream ois =null;
OutputStream os = null;
try {
//创建服务器端套接字ServerSocket
ss= new ServerSocket(8888);
//服务器通过调用侦听方法来获取客户端的请求
socket = ss.accept();
//通过返回的Socket对象调用方法获取一个输入流来读取客户端发送过来的消息
is = socket.getInputStream();
//通过输入流读取客户端发送的消息
ois = new ObjectInputStream(is);
Student student = (Student)ois.readObject();
System.out.println("我这边是服务器:客户端发送给我的数据是:"+student);
//关闭通道
socket.shutdownInput();
//服务器接收客户端消息后,需要给客户端一个响应信息
os = socket.getOutputStream();
String result = "获取的对象姓名和年龄正确";
os.write(result.getBytes());
System.out.println("给客户端的响应信息发送成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
os.close();
ois.close();
is.close();
socket.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
ObjectOutputStream oos = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建通信链路的端点客户端套接字
socket = new Socket("127.0.0.1", 8888);
//获取输出流将数据发送出去
os = socket.getOutputStream();
Student student = new Student("张三", 23);
oos = new ObjectOutputStream(os);
oos.writeObject(student);
System.out.println("我是客户端,我将数据发送完毕");
//关闭通道
socket.shutdownOutput();
//客户端需要通过输入流读取服务器端发送过来的消息
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
String result = br.readLine();
System.out.println("我是客户端,接收到的服务器端响应信息为:"+result);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import cn.bdqn.demo03.Student;
public class Client1 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
ObjectOutputStream oos = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建通信链路的端点客户端套接字
socket = new Socket("127.0.0.1", 8888);
//获取输出流将数据发送出去
os = socket.getOutputStream();
Student student = new Student("张三", 23);
oos = new ObjectOutputStream(os);
oos.writeObject(student);
System.out.println("我是客户端1,我将数据发送完毕");
//关闭通道
socket.shutdownOutput();
//客户端需要通过输入流读取服务器端发送过来的消息
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
String result = br.readLine();
System.out.println("我是客户端,接收到的服务器端响应信息为:"+result);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import cn.bdqn.demo03.Student;
public class Client2 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
ObjectOutputStream oos = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建通信链路的端点客户端套接字
socket = new Socket("127.0.0.1", 8888);
//获取输出流将数据发送出去
os = socket.getOutputStream();
Student student = new Student("李四", 23);
oos = new ObjectOutputStream(os);
oos.writeObject(student);
System.out.println("我是客户端2,我将数据发送完毕");
//关闭通道
socket.shutdownOutput();
//客户端需要通过输入流读取服务器端发送过来的消息
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
String result = br.readLine();
System.out.println("我是客户端,接收到的服务器端响应信息为:"+result);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import cn.bdqn.demo03.Student;
public class Client3 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
ObjectOutputStream oos = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建通信链路的端点客户端套接字
socket = new Socket("127.0.0.1", 8888);
//获取输出流将数据发送出去
os = socket.getOutputStream();
Student student = new Student("王五", 23);
oos = new ObjectOutputStream(os);
oos.writeObject(student);
System.out.println("我是客户端3,我将数据发送完毕");
//关闭通道
socket.shutdownOutput();
//客户端需要通过输入流读取服务器端发送过来的消息
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
String result = br.readLine();
System.out.println("我是客户端,接收到的服务器端响应信息为:"+result);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/*
* 多个客户端向服务器发送请求,服务器怎么办???
*
*
* 客户端跟之前客户端做的事情没有任何改变
* 客户端通过输出流发送请求信息
* 客户端通过输入流获取服务器端的响应信息
* 服务器端做的事情跟之前服务器端做的事情不一样
* 服务器端循环去侦听客户端的请求,侦听到一个请求就会获取一个Socket类对象,
* 将这个Socket类对象作为参数传递给服务器线程类的有参构造方法里去
* 服务器线程类通过获取到的Socket类对象去执行原来服务器所做的事情
* 通过输入流获取客户端的请求信息
* 通过输出流发送响应信息给客户端
*
*/
public static void main(String[] args) {
ServerSocket ss = null;
Socket socket = null;
try {
//创建ServerSocket类对象
ss = new ServerSocket(8888);
while(true){
socket = ss.accept();
//将获取到的socket对象传递到线程类中
ServerThread st = new ServerThread(socket);
st.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
socket.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ServerThread extends Thread {
//声明一个Socket类型的属性
private Socket socket;
public ServerThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
InputStream is =null;
ObjectInputStream ois =null;
OutputStream os =null;
try {
//通过返回的Socket对象调用方法获取一个输入流来读取客户端发送过来的消息
is = socket.getInputStream();
ois = new ObjectInputStream(is);
Student student = (Student)ois.readObject();
System.out.println("我这边是服务器:客户端发送给我的数据是:"+student);
//关闭通道
socket.shutdownInput();
//服务器接收客户端消息后,需要给客户端一个响应信息
os =socket.getOutputStream();
String result = "获取的对象姓名和年龄正确";
byte[] bytes = result.getBytes();
os.write(bytes);
System.out.println("给客户端的响应信息发送成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
os.close();
ois.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Receive {
public static void main(String[] args) {
/*
* 示例06:升级示例05,发送方发送咨询问题,接收方回应咨询。
*
* 接收方实现步骤如下:
* (1)创建DatagramPacket对象,准备接收封装的数据。
* (2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
* (3)利用DatagramPacket对象处理数据。
*/
Scanner sc = new Scanner(System.in);
DatagramSocket ds = null;
DatagramPacket dp = null;
DatagramPacket dpto = null;
// 创建DatagramPacket对象,用来准备接收数据
byte[] buf = new byte[1024];
dp = new DatagramPacket(buf, 1024);
while(true){
try {
// 创建DatagramSocket对象,接收数据
ds = new DatagramSocket(8800);
ds.receive(dp);
// 显示接收到的信息
String mess = new String(dp.getData(), 0, dp.getLength());
System.out.println(dp.getAddress().getHostAddress() + "说:" + mess);
String reply = sc.nextLine();
// 显示与本地对话框
System.out.println("我 说:" + reply);
// 创建DatagramPacket对象,封装数据
SocketAddress sa = dp.getSocketAddress();
dpto = new DatagramPacket(reply.getBytes(),
reply.getBytes().length, sa);
ds.send(dpto);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
ds.close();
}
}
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Send {
/*
* 示例06:升级示例05,发送方发送咨询问题,接收方回应咨询。
*
* 发送方实现步骤如下:
* (1)获取本地主机的InetAddress对象。
* (2)创建DatagramPacket对象,封装要发送的信息。
* (3)利用DatagramSocket对象将DatagramPacket对象数据发送出去。
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
DatagramSocket ds = null;
InetAddress ia = null;
while(true){
String mess = sc.nextLine();
System.out.println("我说:" + mess);
try {
// 获取本地主机地址
ia = InetAddress.getByName("localhost");
// 创建DatagramPacket对象,封装数据
DatagramPacket dp = new DatagramPacket(mess.getBytes(),
mess.getBytes().length, ia, 8800);
// 创建DatagramSocket对象,向服务器发送数据
ds = new DatagramSocket();
ds.send(dp);
byte[] buf = new byte[1024];
DatagramPacket dpre = new DatagramPacket(buf, buf.length);
ds.receive(dpre);
// 显示接收到的信息
String reply = new String(dpre.getData(), 0, dpre.getLength());
System.out.println(dpre.getAddress().getHostAddress() + "说:"
+ reply);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
ds.close();
}
}
}
}