初识Socket通信:基于TCP和UDP协议学习网络编程
学习笔记:
1.基于TCP协议的Socket网络编程:
(1)Socket类构造方法:在客户端和服务器端建立连接
Socket s = new Socket(hostName,port);以主机名和端口号作为参数来创建一个Socket对象。
Socket s = new Socket(address,port);以InetAddress对象和端口号作为参数来创建一个Socket对象。
创建Socket对象时可能抛出UnknownHostException或IOException异常,必须捕获它们。
(2)常用方法
InetAddress getInetAddress();返回与Socket对象关联的InetAddress
int getPort();远程端口
int getLocalPort();本地端口
InputStream getInputStream();相关联的InputStream
OutputStream getOutputStream();相关联的OutputStream
void close();关闭该Socket
(3)ServerSocket类:等待客户端建立连接,连接以后进行通信
ServerSocket ss = new ServerSocket(port);接收端口号作为参数
ServerSocket ss = new ServerSocket(port,maxqueue);接收端口号和最大队列长度作为参数。
accept();等待客户端触发通信
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; /**
* 使用Socket变成实现用户登录
* 1.实现单用户登录
* 2.服务器端关键代码
* @author Administrator
*
*/
public class Test0101 { public static void main(String[] args) {
try {
//创建一个服务器Socket(ServerSocket),指定端口8800并开始监听
ServerSocket serverSocket = new ServerSocket(8800);
//使用accept()方法等待客户端触发通信
Socket socket = serverSocket.accept();
//打开输入/输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//获取客户端信息,即从输入流读取信息
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while(!((info = br.readLine())==null)){
System.out.println("我是服务器,客户登录信息为:"+info);
}
socket.shutdownInput();
//给客户端一个响应,即向输出流写入信息
String reply = "欢迎你,登陆成功!";
os.write(reply.getBytes());
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
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.Socket;
import java.net.UnknownHostException; /**
* 使用Socket变成实现用户登录
* 1.实现单用户登录
* 2.客户端关键代码
* @author Administrator
*
*/
public class Test01 { public static void main(String[] args) {
try {
//建立客户端Socket连接,指定服务器的位置为本机以及端口8800
Socket socket = new Socket("127.0.0.1",8800);
//打开输入/输出流
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
//发送客户端登录信息,即向输出流写入信息
String info = "用户名:Tom;用户密码:123456";
os.write(info.getBytes());
socket.shutdownOutput();
//接受服务器端的响应,即从输入流读取信息
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)){
System.out.println("我是客户端,服务器端的响应为:"+reply);
}
//关闭资源
br.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
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; /**
* 服务器端关键代码
* @author Administrator
*
*/
public class Test0201 { public static void main(String[] args) {
try {
//创建一个服务器Socket(ServerSocket)连接,指定端口并开始监听
ServerSocket serverSocket = new ServerSocket(8800);
//使用accpet()方法等待客户端触发通信
Socket socket = serverSocket.accept();
//打开输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//反序列化
ObjectInputStream ois = new ObjectInputStream(is);
//获取客户端信息(从输入流读取信息)
User user = (User)ois.readObject();
if (!(user==null)) {
System.out.println("我是服务器端,客户登录信息为:\n用户名:"+user.getLoginName()+",密码:"+user.getPwd());
}
//给客户端一个响应(向输出流写入信息)
String reply = "欢迎你,登陆成功!";
os.write(reply.getBytes());
//关闭资源
os.close();
ois.close();
is.close();
socket.close();
serverSocket.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
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; /**
* 客户端关键代码
* @author Administrator
*
*/
public class Test02 { public static void main(String[] args) {
try {
//建立客户端Socket连接,指定服务器的位置和端口
Socket socket = new Socket("127.0.0.1",8800);
//打开输入输出流
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(os);
//发送客户端登录信息(向输出流写入数据)
User user = new User();
user.setLoginName("Tom");
user.setPwd("12345678");
oos.writeObject(user);
socket.shutdownOutput();
//接收服务器端的响应(从输入流读取信息)
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)){
System.out.println("我是客户端,服务器端的响应为"+reply);
}
//关闭资源
br.close();
oos.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
案例:实现多客户端用户登录
1.登录线程类
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* 登录线程类
* @author Administrator
*
*/
public class LoginThread extends Thread {
Socket socket = null;
//每启动一个线程,连接对应的Socket接口
public LoginThread(Socket socket){
this.socket = socket;
}
//启动线程,即响应客户请求
public void run(){
try {
//打开输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//反序列化
ObjectInputStream ois = new ObjectInputStream(is);
//获取客户端信息(从输入流读取信息)
User user = (User)ois.readObject();
if (!(user==null)) {
System.out.println("我是服务器端,客户登录信息为:\n用户名:"+user.getLoginName()+",密码:"+user.getPwd());
}
//给客户端一个响应(向输出流写入信息)
String reply = "欢迎你,登陆成功!";
os.write(reply.getBytes());
//关闭资源
os.close();
ois.close();
is.close();
socket.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
2.服务器端的响应
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* 服务器端关键代码
* @author Administrator
*
*/
public class Test0301 { public static void main(String[] args) {
try {
//创建一个服务器Socket(ServerSocket),指定端口并开始监听
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(8800);
//使用accpet()方法等待客户端触发通信
Socket socket = null;
while (true) {
//监听一直进行中
socket = serverSocket.accept();
LoginThread login = new LoginThread(socket);
login.start();
}
} catch (IOException e) {
e.printStackTrace();
} } }
3.客户登陆
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; /**
* 实现多客户端用户登录
* @author Administrator
*
*/
public class Test03 { public static void main(String[] args) {
try {
//建立客户端Socket连接,指定服务器的位置和端口
Socket socket = new Socket("127.0.0.1",8800);
//打开输入输出流
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(os);
//发送客户端登录信息(向输出流写入数据)
User user = new User();
user.setLoginName("Kate");
user.setPwd("12345678");
oos.writeObject(user);
socket.shutdownOutput();
//接收服务器端的响应(从输入流读取信息)
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)){
System.out.println("我是客户端,服务器端的响应为"+reply);
}
//关闭资源
br.close();
oos.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
二、InetAddress类中的工厂方法
static InetAddress getLocalHost();返回本地主机InetAddress对象
static InetAddress getByName(String hostName);返回InetAddress对象
static InetAddress[] getAllByName(String hostName);返回主机名~所有主机对象组
import java.net.InetAddress;
import java.net.UnknownHostException; /**
* 获取淘宝网服务器地址
* @author Administrator
*
*/
public class Test002 { public static void main(String[] args) {
//定义目标网址
String target = "localhost";
System.out.println("------淘宝的主服务器地址------");
InetAddress iad;
try {
iad = InetAddress.getByName(target);
System.out.println(iad);
} catch (UnknownHostException e) {
e.printStackTrace();
} System.out.println("------淘宝的所有服务器地址------");
InetAddress[] iads;
try {
iads = InetAddress.getAllByName(target);
System.out.println(target+"的IP地址有"+iads.length+"个,分别是:");
for (InetAddress ia : iads) {
System.out.println(ia);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} } }
最新文章
- 求两条线段交点zz
- 怎样使用nat和桥接方式解决虚拟机联网问题
- 【转】sql里面的split
- gcd,lcm,ext_gcd,inv
- Codeforces Round #172 (Div. 2) B. Nearest Fraction 二分
- 分析BGARefreshLayout-master
- Nginx日志增长过快详细分析
- 箱型图boxplot函数的使用
- Centos7下安装MySql
- 1、js的基本对象和垃圾回收
- css清除浮动方式总结
- linux下tomcat服务器的相关命令
- 高并发编程基础(java.util.concurrent包常见类基础)
- CentOS 服务器添加简易";回收站";
- 【PAT】B1084 外观数列(20 分)(纯C)
- python 读csv文件时,在csv类型上执行类型转换
- busybox 安装问题解决
- C# Azure 设置云端应用程序的默认时间
- BugPhobia开发篇章:Beta阶段第V次Scrum Meeting
- 17、uwp 打包失败记录