c-s
java.net.Socket 套接字
封装了TCP通讯协议,使用他可以很方便以TCP协议为通讯方式进行数据传输
- 实例化Socket(Socket socket = new Socket(String ip,int port))时需要传入两个参数:
- 1:服务端IP地址 2:服务端端口号
- 通过IP地址可以zhao找到服务端计算机,通过端口可以找到运行在服务端计算机上的服务端应用程序
- 实例化的过程就是连接的过程,若连接失败,那么这里会抛出异常
package socket;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 聊天室客户端
* @author liuyanyan
*
*/
public class Client {
/*
* java.net.Socket
* 套接字 封装了TCP协议通讯,使用它可以很方便的以TCP协议为通讯方式进行数据传输
*/
private Socket socket;
/**
* 构造方法,用来初始化客户端
*/
public Client() {
try {
/*
* 实例化Socket时需要传入两个参数
* 1、服务端IP地址
* 2、服务端端口号
* 通过IP地址可以找到服务端计算机,通过端口可以找到运行在服务端计算机上的服务端应用程序
* 实例化的过程就是连接的过程,若连接失败,那么这里会抛出异常
*/
System.out.println("正在连接服务端.....");
socket = new Socket("172.20.10.3", 8088);//连接本地localhost/127.0.0.1
System.out.println("已连接");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 客户端开始工作
*/
public void start() {
try {
//将字节通过网络发送给对方计算机
OutputStream out=socket.getOutputStream();
//转换流,负责将字符转换为字节
OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
//负责缓冲,将写操作转换为块写操作
BufferedWriter bw = new BufferedWriter(osw);
//可以自动行刷新,并按行写字符串
PrintWriter pw=new PrintWriter(bw,true);
/*String message="你好,服务器!";
pw.println(message);*/
Scanner scn = new Scanner(System.in);
while(true) {
String message = scn.nextLine();
if("exit".equals(message)) {
pw.println(message);
break;
}
pw.println(message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}
java.net.ServerSocket 运行在服务端
- 主要有两个作用
- 1:向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的
- 2:监听服务端,等待客户端连接,一旦一个客户端通过服务端口与客户端建立连接,那么ServerSocket会主动创建一个Socket与客户端进行通讯
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 聊天室服务端
* @author liuyanyan
*
*/
/*
* native :本地c库中的方法
* jni: java native interface java本地接口
*/
public class Server {
/*
* 运行在服务端的java.net.ServerSocket
* 主要有两个作用
* 1:向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的
* 2:监听服务端口,等待客户端连接,一旦一个客户端通过服务端口与服务端建立连接,
* 那么ServerSocket会主动创建一个Socket与客户端进行通讯。
*/
private ServerSocket server;
/*
* 构造方法用来初始化服务端
*/
public Server() {
try {
System.out.println("启动服务器");
server= new ServerSocket(8088);
System.out.println("服务器启动成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 服务端开始工作的方法
*/
public void start() {
//阻塞
try {
/*
* ServerSocket提供的方法
* Socket accept();
* 该方法是一个阻塞方法,调用后进入阻塞,知道一个客户端连接为止,这时该方法会返回一个Socket,
* 通过这个Socket就可以与刚建立连接的客户端进行通讯
*/
System.out.println("等待客户端连接");
Socket socket = server.accept();
System.out.println("客户端连接");
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
/*String message = br.readLine();
System.out.println(message);*/
while(true) {
String message = br.readLine();
if("exit".equals(message)) {
System.out.println("客户端说"+message);
break;
}
System.out.println("客户端说"+message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
}