tcp 的特点
1,服务端和客户端基于serveraSocket 形成一个连接
2,基于请求和响应模式,(第一次发起请求的叫客户端,第一次响应请求的叫服务端)
3, 使用io流进行传输
4,稳定,安全,消耗大
5,客户端的输出流,就是服务端的输入流;服务端的输出流,就是客户端的输入流;
*********************
服务端 (为什么没有用lambda表达式来写线程体,因为不好维护)
package networkCoding;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* 1, 指定端口,使用serverSocket创建服务器
* 2, 阻塞式等待连接accept
* 3, 操作:输入输出流操作
* 4, 释放资源
*
* **/
public class TcpSever {
public static void main(String[] args) throws IOException {
System.out.println("----server-----");
//1, 指定端口,使用serverSocket创建服务器
ServerSocket server = new ServerSocket(8888);
boolean isRunning= true;
while(isRunning) {
Socket client = server.accept();
new Thread(new Talk(client)).start();
}
server.close();
}
static class Talk implements Runnable{
private DataInputStream dis;
private Socket client;
private DataOutputStream dos;
String uname= "";
String pwd="";
public Talk( Socket client) {
try {
this.client =client;
this.dis= new DataInputStream(client.getInputStream());
this.dos= new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
String dataString = this.receiveData();
for (String string : dataString.split("&")) {
String[] quStrings=string.split("=");
String first= quStrings[0];
String sec=quStrings[1];
if(first.equals("uname")){
this.uname=sec;
}else {
this.pwd=sec;
}
}
if(uname.equals("wangrong")&&pwd.equals("wangrong")) {
this.writeData("登录成功");
}else {
this.writeData("登录失败");
}
// 4, 释放资源
this.release() ;
}
private String receiveData() {
String data="";
try {
data=dis.readUTF();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
private void writeData(String msg) {
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void release() {
try {
if(null!=dos) {
dos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(null!=dis) {
dis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(null!=client) {
client.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
客户端
package networkCoding;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
*
* 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;
* 2, 操作:输入输出流操作
* 3, 释放资源
*
* **/
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("----client-----");
// 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;
Socket client = new Socket("localhost",8888);
TalkClient tClient=new TalkClient(client);
tClient.writeData();
// 2, 操作:输入输出流操作
String backString=tClient.receiveData();
System.out.println(backString);
// 3, 释放资源
}
static class TalkClient{
private DataInputStream dis;
private Socket client;
private DataOutputStream dos;
String datas="";
public TalkClient( Socket client) {
try {
this.client =client;
this.dis= new DataInputStream(client.getInputStream());
this.dos= new DataOutputStream(client.getOutputStream());
datas=this.init();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String init() {
BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名");
String uname="";
String pwd="";
try {
uname = bf.readLine();
System.out.println("请输入密码");
pwd= bf.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "uname="+uname+"&pwd="+pwd;
}
private String receiveData() {
String data="";
try {
data=dis.readUTF();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
private void writeData() {
try {
dos.writeUTF(this.datas);
dos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void release() {
try {
if(null!=dos) {
dos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(null!=dis) {
dis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(null!=client) {
client.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}