Socket通信
一.TCP协议
1.Socket:客户端的Socket
*
1.创造客户端的Socket
*
2.通过输出流,请求发出
*
3.输入流接收服务器的回应 //首先关闭客户端的输出流 客户端.shutdownOutput( )方法,得到输入流读取回应
*
4.释放资源
package cn.com.abner.intener.TCPdemo1.传数据;
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 Coco1 {
public static void main(String[] args) {
//客户端接口
try {
Socket coco=new Socket("localhost",5000);
String info="Abner";
OutputStream a=coco.getOutputStream();
byte[] infos=info.getBytes();
a.write(infos);
//输入流接收服务器的回应
coco.shutdownOutput(); //关闭客户端的输出流
InputStream d=coco.getInputStream();
BufferedReader f=new BufferedReader(new InputStreamReader(d));
String reply;
while((reply=f.readLine())!=null) {
System.out.println("服务器回应"+reply);
}
f.close();
d.close();
a.close();
coco.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
*
2.ServerSocket:服务器端的Socket
*
1.创建一个Socket
*
2.监听的方法 accept( ) //监听并接收到端口中
*
3.获得输入流,获得用户请求 //服务器的输入流即为来自客户端的输入
*
4.回应客户端:通过输出流回应客户端 //服务器的输出流即为往客户端输出
*
5.释放相应资源
package cn.com.abner.intener.TCPdemo1.传数据;
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 Server1 {
public static void main(String[] args) {
//获取端口
try {
ServerSocket server=new ServerSocket(5000);
//监听
Socket coco=server.accept();
//输入流
InputStream a=coco.getInputStream(); //服务器的输入即为从客户端的输入
BufferedReader b=new BufferedReader(new InputStreamReader(a));
String info;
while((info=b.readLine())!=null) {
System.out.println("客户输入"+info);
}
//给客户端一个回应
String reply=" 欢迎登陆";
//通过输出流
OutputStream c=coco.getOutputStream(); //服务器的输出即为往客户端的输出
c.write(reply.getBytes());
//关
c.close();
b.close();
a.close();
coco.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
*** 传递对象之前,必须实现Serializable接口**
package cn.com.abner.intener.TCPdemo2传对象;
import java.io.Serializable;
public class person implements Serializable {
private String name;
private String mima;
public person() {
}
public person(String name, String mima) {
this.name = name;
this.mima = mima;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMima() {
return mima;
}
public void setMima(String mima) {
this.mima = mima;
}
}
package cn.com.abner.intener.TCPdemo2传对象;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
public static void main(String[] args) {
//获取端口
try {
ServerSocket server=new ServerSocket(5000);
//监听
Socket coco=server.accept();
//输入流
InputStream a=coco.getInputStream();
ObjectInputStream b=new ObjectInputStream(a);
person ps = null;
try {
ps = (person)b.readObject();
System.out.println("客户端输入姓名为 "+ps.getName()+"密码为 "+ps.getMima());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//给客户端一个回应
String reply=" 欢迎登陆";
//通过输出流
OutputStream c=coco.getOutputStream(); //服务器的输出即为往客户端的输出
c.write(reply.getBytes());
//关
c.close();
b.close();
a.close();
coco.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package cn.com.abner.intener.TCPdemo2传对象;
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 Coco1 {
public static void main(String[] args) {
//客户端接口
try {
Socket coco=new Socket("localhost",5000);
//发送请求
person ps=new person("Abner","12345");
OutputStream a=coco.getOutputStream();
ObjectOutputStream b=new ObjectOutputStream(a);
b.writeObject(ps);
//输入流接收服务器的回应
coco.shutdownOutput(); //关闭客户端的输出流
InputStream d=coco.getInputStream();
BufferedReader f=new BufferedReader(new InputStreamReader(d));
String reply;
while((reply=f.readLine())!=null) {
System.out.println("服务器回应"+reply);
}
f.close();
d.close();
a.close();
b.close();
coco.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.实现多客户端通行
*
思路:在服务器端根据不同的客户端执行不同的线程
package cn.com.abner.intener.TCPdemo3多线程;
import java.io.Serializable;
public class person implements Serializable {
private String name;
private String mima;
public person() {
}
public person(String name, String mima) {
this.name = name;
this.mima = mima;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMima() {
return mima;
}
public void setMima(String mima) {
this.mima = mima;
}
}
*
线程类
*
接收客户端请求,回复回应
每一个线程构造方法绑定一个客户端的socket
*/
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.Socket;
public class ServerThread extends Thread{
private Socket coco;
//每一个线程构造方法绑定一个客户端的socket
public ServerThread(Socket coco) {
this.coco = coco;
}
//接收客户端请求,回复回应
public void run() {
try {
//输入流
InputStream a=coco.getInputStream();
ObjectInputStream b=new ObjectInputStream(a);
person ps = null;
try {
ps = (person)b.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("客户端输入姓名为 "+ps.getName()+"密码为 "+ps.getMima());
//获得客户端的IP
InetAddress ia=coco.getInetAddress();
String IP=ia.getHostAddress();
System.out.println("相对应的IP为 "+IP);
//给客户端一个回应
String reply=" 欢迎登陆";
//通过输出流
OutputStream c=coco.getOutputStream(); //服务器的输出即为往客户端的输出
c.write(reply.getBytes());
//关
c.close();
b.close();
a.close();
coco.close();
}catch(Exception ex) {
ex.printStackTrace();
}
}
}
*
服务器端
*
1.获取服务器端口
*
2.监听 //因为要接收多个客户端请求,要一直处于监听状态(无限循环实现)
*
3.在循环内,监听–>创建一个和该客户端响应的线程–>启动线程
package cn.com.abner.intener.TCPdemo3多线程;
//服务器端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
//获取端口
try {
ServerSocket server=new ServerSocket(5000);
//一直监听状态
while(true) {
Socket coco=server.accept();
//创建一个和该客户端响应的线程
ServerThread a=new ServerThread(coco);
//启动线程
a.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
*
客户端不发生变化
*
1.创造客户端的Socket
*
2.通过输出流,请求发出
*
3.输入流接收服务器的回应 //首先关闭客户端的输出流 客户端.shutdownOutput( )方法,得到输入流读取回应
*
4.释放资源
package cn.com.abner.intener.TCPdemo3多线程;
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 Coco1 {
public static void main(String[] args) {
//客户端接口
try {
Socket coco=new Socket("localhost",5000);
//发送请求
person ps=new person("Abner","12345");
OutputStream a=coco.getOutputStream();
ObjectOutputStream b=new ObjectOutputStream(a);
b.writeObject(ps);
//输入流接收服务器的回应
coco.shutdownOutput(); //关闭客户端的输出流
InputStream d=coco.getInputStream();
BufferedReader f=new BufferedReader(new InputStreamReader(d));
String reply;
while((reply=f.readLine())!=null) {
System.out.println("服务器回应"+reply);
}
f.close();
d.close();
a.close();
b.close();
coco.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二.UDP协议
DatagramSocket (服务器客户端)
*
1.客户端
*
发送数据
*
1.定义发送数据
*
2.将数据打散到byte数组中
*
3.获取对方的主机
*
4.创造客户端发送端口
*
5.将数据打包成数据包(需要2的字节数组,和3的对方主机,才能完成打包)
*
6.客户端口发送数据包(需要4的客户端口和5的数据包,才能完成发送)
*
收取服务器回应
*
1.定义收取包
*
2.在端口把数据包放在收取包中
*
3,取出数据包中的数据
*
释放资源
package cn.com.abner.intener.UDPdemo1数据;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Coco {
public static void main(String[] args) {
//数据
String info="Allen";
//打散数据
byte[] infos=info.getBytes();
//对方的地址和端口
InetAddress ia;
//创造端口
DatagramSocket coco;
try {
ia = InetAddress.getByName("localhost");
//将数据打包成数据包
DatagramPacket dp=new DatagramPacket(infos, infos.length,ia ,5000 );
coco=new DatagramSocket();
//端口发送数据
coco.send(dp);
//收取服务器回应
//收取包
byte[] replys=new byte[1024];
DatagramPacket rp=new DatagramPacket(infos,infos.length);
//端口接收
coco.receive(rp);
//取出数据包中的数据
String reply=new String(rp.getData(),0,rp.getData().length);
System.out.println("服务器回应 "+reply);
coco.close();
} catch (UnknownHostException e) {
e.printStackTrace();
}catch (SocketException e1) {
e1.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
2.服务器端
收取服务器回应
1.定义收取包
2.创造服务器的接收端
3.在端口把数据包放在收取包中
4.取出数据包中的数据
回应客户端
1.定义回应数据
2.获取服务器中的端口地址
3.打包回应的数据
4.发送回应数据包
释放资源
package cn.com.abner.intener.UDPdemo1数据;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.net.SocketException;
public class Server {
public static void main(String[] args) {
//收取包
byte [] infos=new byte[1024];
DatagramPacket dp=new DatagramPacket(infos,infos.length);
//创造接收端口
try {
DatagramSocket server=new DatagramSocket(5000);
//取出数据到收取包中
server.receive(dp);
//取出数据包中的数据
String info=new String(dp.getData(),0,dp.getData().length);
System.out.println("客户端输入 "+info);
//给客户端回应
String reply="OK";
byte[] replys=reply.getBytes();
//获得服务器的端口地址
SocketAddress ia=dp.getSocketAddress();
//打包回应数据
DatagramPacket rp=new DatagramPacket(replys, 0, replys.length,ia);
//发送数据包
server.send(rp);
server.close();
} catch (SocketException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}