客户端
第一种方式
package demo;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
static Socket socket;
static String serverHost = "192.168.1.70";//服务器端的ip地址
static int serverPort = 8003;//服务器端的端口号
public static void main(String[] args)throws IOException {
try{
System.out.println("正在连接");
socket = new Socket(serverHost, serverPort);//请求连接,连接的目的服务器的ip和端口号要作为参数
try {
System.out.println("连接成功");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner scanner = new Scanner(System.in);
//第一种读取数据的方式
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte [] buf = new byte[1024];
int line = 0;
while ((line=in.read(buf)) !=-1){
System.out.print(new String(buf,0,line));
String s = scanner.nextLine();
out.write(("客户端:"+s+"\n").getBytes());
System.out.println("客户端: "+s);
}
//第二种读取方式
// String r = "";
// while ((r = bufferedReader.readLine())!=null){ //readLine()只能读取\n、\r结尾的数据
// System.out.println(r);//读取一行服务器端写入的文本,注意文本要以换行符或者回车结尾
// }
}finally {
socket.close();
}
}catch (Exception e){
System.out.println("连接失败");
}
}
}
服务端
package demo;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
private static int port = 8003;//设置端口号
public static void main(String[] args)throws IOException {
try{
ServerSocket serverSocket = new ServerSocket(port);//第一步设置服务器端口号
System.out.println("等待连接....");
Socket socket = serverSocket.accept();//第二步等待客户端发送连接请求
System.out.println("客户端已连接成功");
try {
//第三步创建和客户端的的输入输出对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner in= new Scanner(System.in);
String s = null;
while ((s = in.nextLine()) != null){
System.out.println("服务器:"+s);
bufferedWriter.write("服务器:"+s+"\n"); //加入\n 是因为readLine()方法需要 读到\n、\r、\n\r才能输出数据
bufferedWriter.flush(); //一定要刷新才能发送成功
String read = bufferedReader.readLine();
System.out.println(read);
}
}finally {
serverSocket.close();
socket.close();
}
}catch (Exception e){
System.out.println("连接失败");
e.printStackTrace();
}
}
}
第二种方式
服务端
package test;
import java.io.DataInputStream; //导入 DataInputStream类
import java.io.DataOutputStream;//导入DataOutputStream类
import java.io.IOException;//导入IOException类
import java.net.ServerSocket;//导入ServerSocket类
import java.net.Socket; //导入Socket 类
import java.util.Scanner; //导入Scanner类
/**
* 模拟qq聊天功能: 实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,
* 然后服务器端也可以输入信息,同样信息也在客户端和服务器端显示
*/
// 服务器类
public class ChatServer {//ChatServer类
private int port = 8003;// 默认服务器端口
public ChatServer() {
}
// 创建指定端口的服务器
public ChatServer(int port) {//构造方法
this.port = port;//将方法参数赋值给类参数
}
// 提供服务
public void service() {//创建service方法
try {// 建立服务器连接
System.out.println("正在连接...");
ServerSocket server = new ServerSocket(port);//创建 ServerSocket类
Socket socket = server.accept();// 等待客户连接
System.out.println("连接成功");
try {
DataInputStream in = new DataInputStream(socket
.getInputStream());// 读取客户端传过来信息的DataInputStream
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());// 向客户端发送信息的DataOutputStream
Scanner scanner = new Scanner(System.in);//从键盘接受数据
while (true) {
// String accpet = in.readUTF();// 读取来自客户端的信息
// System.out.println(accpet);//输出来自客户端的信息
String send = scanner.nextLine();//nextLine方式接受字符串
out.writeUTF("服务器:" + send);//把服务器端的输入发给客户端
}
} finally {// 建立连接失败的话不会执行socket.close();
socket.close();//关闭连接
server.close();//关闭
}
} catch (IOException e) {//捕获异常
System.out.println("连接失败");
e.printStackTrace();
}
}
public static void main(String[] args) {//主程序方法
new ChatServer().service();//调用 service方法
}
}
客户端
package test;
import java.io.DataInputStream;//导入DataInputStream类
import java.io.DataOutputStream;//导入DataOutputStream
import java.io.IOException;//导入IOException类
import java.net.Socket;//导入Socket类
import java.util.Scanner;//导入Scanner类
/**
* 注意用到的输入输出流DataInputStream和DataOutputStream,成对出现,最好用字节流
*/
// 客户端类
public class ChatClient {//创建公共类
private String host = "192.168.1.70";// 默认连接到本机
private int port = 8003;// 默认连接到端口8189
public ChatClient() {
}
// 连接到指定的主机和端口
public ChatClient(String host, int port) {//构造方法
this.host = host;//将构造方法的参数host传递给类变量host
this.port = port;//将构造方法的参数port传递给类变量port
}
public void chat() {//chat方法
try {
// 连接到服务器
System.out.println("正在连接....");
Socket socket = new Socket(host, port);//创建Socket类对象
try {
DataInputStream in = new DataInputStream(socket
.getInputStream());// 读取服务器端传过来信息的DataInputStream
System.out.println("连接成功");
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());// 向服务器端发送信息的DataOutputStream
Scanner scanner = new Scanner(System.in);// 装饰标准输入流,用于从控制台输入
while (true) {
// String send = scanner.nextLine();//读取控制台输入的内容
// System.out.println("客户端:" + send);//输出键盘输出内容提示 ,也就是客户端向服务器端发送的消息
// // 把从控制台得到的信息传送给服务器
// out.writeUTF("客户端:" + send);//将客户端的信息传递给服务器
String accpet = in.readUTF();// 读取来自服务器的信息
System.out.println(accpet);//输出来自服务器的信息
}
} finally {
socket.close();//关闭Socket监听
}
} catch (IOException e) {//捕获异常
System.out.println("连接失败");
e.printStackTrace();
}
}
public static void main(String[] args) {//主程序方法
new ChatClient().chat();//调用chat方法
}
}