1.Socket通信 TCP:
步骤:
1.创建ServerSocket和Socket
2.打开连接到Socket的输入/输出流。
3.按照协议对Socket进行读/写操作。
4.关闭输入输出流、关闭Socket.
服务端:
1.创建ServerSocket对象,绑定监听端口
2.通过accept()方法监听客服端的请求。
3.连接建立后,通过输入流读取客户端发送的请求信息
4.通过输出流向客户端发送响应的信息
5.关闭相关资源。
客户端:
1.创建Socket 对象,指明要连接的服务器的地址和端口号。
2.连接建立后。通过输出流向服务端发送请求。
3.通过输入流获取服务器的响应信息。
4.关闭相关资源。
2.例子
先启动服务端 在q启动客户端。
package cn.lanz.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @描述: 客户端
* @描述: 基于TCP协议的Socket通信,
* @version 创建时间: 2016-12-5:下午3:17:43
* @E-mail 邮箱:
* @author 作者:
*/
public class Client {
public static void main(String[] args) throws Exception, IOException {
//创建客户端Socket,指定服务器地址和端口号
Socket sk=new Socket("localhost", 8888);
//获取输出流,向服务器发送信息
OutputStream os=sk.getOutputStream();//字节输出流
//字节流转为打印流
PrintWriter pw=new PrintWriter(os);//将输出流转为打印流
pw.write("用户名:admin;密码:123");
pw.flush();
sk.shutdownOutput();//关闭输出流
//接收服务端响应
InputStream in= sk.getInputStream();//获取输入流
InputStreamReader isr=new InputStreamReader(in);//包装成字符流
//添加缓冲
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务端说:"+info);
}
br.close();
isr.close();
in.close();
pw.close();
os.close();
sk.close();
}
}
------
package cn.lanz.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @描述: 服务端
* @描述: 基于TCP协议的Socket通信,实现用户登录。
* @version 创建时间: 2016-12-5:下午3:18:00
* @E-mail 邮箱:
* @author 作者:
*/
public class Server {
public static void main(String[] args) throws Exception {
//创建服务端的Socket--》ServerSocket,指定端口,并监听此端口。
ServerSocket serverSocket=new ServerSocket(8888);
//调用accept()方法开始监听,等待客户端的连接。
System.out.println("****服务器即将开始,等待客户端连接****");
Socket socket = serverSocket.accept();
//获取输入流,并获取客户端信息。
InputStream is=socket.getInputStream();//字节输入流
//字节流转为字符流
InputStreamReader isr=new InputStreamReader(is);//字符流
//为输入流添加缓冲
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine()) != null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//获取输出流响应客户端信息
OutputStream out=socket.getOutputStream();
PrintWriter pw=new PrintWriter(out);//包装打印流
pw.write("欢迎你");
pw.flush();//刷新缓存
pw.close();
out.close();
br.close();
isr.close();
is.close();
}
}
3.多线程实现多客户端通信。
步骤:
1.服务端创建了ServerSocket,循环调用accept()方法等待客户端连接。
2.客户端创建一个Socket并请求和服务端连接。
3.服务端接收客户端请求,建立了socket与当前客户=建立专一连接。
4.建立连接的两个socket在一个单独的线程上对话
5.服务端继续等待新连接。
package cn.lanz.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @描述: 服务器线程处理类
* @描述: 基于TCP协议的Socket通信,实现用户登录。
* @version 创建时间: 2016-12-5:下午4:57:46
* @E-mail 邮箱:
* @author 作者:
*/
public class ServerThread extends Thread{
//创建和本线程相关的socket
Socket socket=null;
//构造方法进行初始化
public ServerThread(Socket socket){
this.socket=socket;
}
//执行线程操作,响应客户端请求
public void run(){
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream out = null;
PrintWriter pw = null;
try {
//获取输入流,并获取客户端信息。
is = socket.getInputStream();//字节输入流
//字节流转为字符流
isr=new InputStreamReader(is);//字符流
//为输入流添加缓冲
br=new BufferedReader(isr);
String info=null;
while((info=br.readLine()) != null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//获取输出流响应客户端信息
out=socket.getOutputStream();
pw=new PrintWriter(out);//包装打印流
pw.write("欢迎你");
pw.flush();//刷新缓存
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(pw!=null){
pw.close();
}
if(out!=null){
out.close();
}
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package cn.lanz.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @描述: 服务端
* @描述: 基于TCP协议的Socket通信,实现用户登录。
* @version 创建时间: 2016-12-5:下午3:18:00
* @E-mail 邮箱:
* @author 作者:
*/
public class Server {
public static void main(String[] args) throws Exception {
//创建服务端的Socket--》ServerSocket,指定端口,并监听此端口。
ServerSocket serverSocket=new ServerSocket(8888);
//调用accept()方法开始监听,等待客户端的连接。
System.out.println("****服务器即将开始,等待客户端连接****");
Socket socket = null;
//记录客户端请求数量
int count=0;
//循环监听等待客户端连接
while(true){
socket = serverSocket.accept();
//创建一个新线程
ServerThread serverThread=new ServerThread(socket);
serverThread.start();//启动线程.
count++;//统计客户端数量
System.out.println("客户端数量:"+count);
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端IP:"+address.getHostAddress());
}
}
}
package cn.lanz.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @描述: 客户端
* @描述: 基于TCP协议的Socket通信,
* @version 创建时间: 2016-12-5:下午3:17:43
* @E-mail 邮箱:
* @author 作者:
*/
public class Client {
public static void main(String[] args) throws Exception, IOException {
//创建客户端Socket,指定服务器地址和端口号
Socket sk=new Socket("localhost", 8888);
//获取输出流,向服务器发送信息
OutputStream os=sk.getOutputStream();//字节输出流
//字节流转为打印流
PrintWriter pw=new PrintWriter(os);//将输出流转为打印流
// pw.write("用户名:admin;密码:123");
pw.write("用户名:aaa;密码:123");
pw.flush();
sk.shutdownOutput();//关闭输出流
//接收服务端响应
InputStream in= sk.getInputStream();//获取输入流
InputStreamReader isr=new InputStreamReader(in);//包装成字符流
//添加缓冲
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务端说:"+info);
}
br.close();
isr.close();
in.close();
pw.close();
os.close();
sk.close();
}
}