网络编程 Socket
Socket可以看成是两个程序进行通讯连接中的一个端口
主要还是代练习
客户机与服务机直接的通讯(Tcp)
服务机
/**
* 服务器端程序
* @author Administrator
*
*/
public class Server {
//1、定义资源
ServerSocket serverSocket; //服务器端ServerSocket
private int port=8989;
//2、初始化,启动服务器
public Server(){
try {
serverSocket=new ServerSocket(port); //实例化ServerSocket
System.out.println("服务器启动成功!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务器启动失败!");
}
}
//3、处理业务
public void service(){
while(true){
Socket socket=null;
try {
socket=serverSocket.accept();//接收客户的链接请求,返回Socket对象,阻塞
//分配给工作线程
new HandlerThread(socket).start();
//接收器(输入流)
// BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
// //1、字节流
// InputStream is=socket.getInputStream();
//
// //2、字节流——>字符流
// InputStreamReader isr=new InputStreamReader(is);
//
// //3、字符流——>缓冲流
// BufferedReader br=new BufferedReader(isr);
//发送器(输出流)
// PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
// //1、字节流
// OutputStream os=socket.getOutputStream();
//
// //2、字节流——>字符流
// OutputStreamWriter osw=new OutputStreamWriter(os);
//
// //3、字符流——>PrintWriter
// PrintWriter pw=new PrintWriter(osw,true);
// String msg=null;
//读取客户的发生的信息
// while((msg=br.readLine())!=null){
// if(msg.equals("quit")||msg.equals("MagicExit")){
// break;
// }
// System.out.println(clientAdd+":"+clientPort+"> "+msg);
//写出发送信息
//回声
// pw.println("you said: "+msg); //返回输出给客户端
//聊天发送信息
// Scanner in=new Scanner(System.in);
// msg=in.nextLine();
// pw.println(msg); //返回输出给客户端
//
// }
// if(msg.equals("MagicExit")){
// break;
// }
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server().service();
}
}
客户机
public class Client {
//1、资源
Socket socket;
String host="127.0.0.1"; //127.0.0.1 localhost
int port=8889;
//2、连接到服务器
public Client() {
try {
socket=new Socket(host,port);
System.out.println("连接服务器成功!");
} catch (UnknownHostException e) {
e.printStackTrace();
System.out.println("主机无法找到!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("连接服务器错误!");
}
}
//3、处理业务
public void send(){
try {
//发送器
PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
//接收器
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
Scanner in=new Scanner(System.in);
String msg=in.nextLine();
pw.println(msg); //发送信息
if(msg.equals("quit")||msg.equals("MagicExit")){
break;
}
msg=br.readLine(); //接收服务器端返回的信息
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().send();
}
}
多线程处理 可以实现多个客户机连接一个服务机
public class HandlerThread extends Thread {
Socket socket;
BufferedReader br;
PrintWriter pw;
public HandlerThread(Socket socket) {
this.socket=socket;
}
/**
* 初始化
* @throws IOException
*/
public void init() throws IOException{
//接收器(输入流)
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//发送器(输出流)
pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
}
@Override
public void run() {
try {
init();
//获得客户端连接信息(地址,端口)
String clientAdd=socket.getInetAddress().getHostAddress();
int clientPort=socket.getPort();
System.out.println("来自"+clientAdd+":"+clientPort+"的连接请求。");
String msg=null;
//读取客户的发生的信息
while((msg=br.readLine())!=null){
if(msg.equals("quit")||msg.equals("MagicExit")){
break;
}
System.out.println(clientAdd+":"+clientPort+"> "+msg);
//写出发送信息
//回声
pw.println("you said: "+msg); //返回输出给客户端
//聊天发送信息
// Scanner in=new Scanner(System.in);
// msg=in.nextLine();
// pw.println(msg); //返回输出给客户端
//
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}