全栈工程师开发手册 (作者:栾鹏)
java教程全解
java实现tcp服务器(单线程、多线程)、客户端。
服务器端接收客户申请,响应时间戳和用户源字符串。
客户端使用控制台作为输入输出流
tcp服务器端代码
package com.lp.app.net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//tcp服务器,单线程和多线程
public class TCPServer{
public static void main(String[] args) {
moreserver(1234);
}
//读取输入文本,返回响应文本(二级制,对象)
public static void server(int port) {
try {
//创建一个serversocket
ServerSocket mysocket=new ServerSocket(port);
//等待监听是否有客户端连接
Socket sk = mysocket.accept();
//接收文本信息
BufferedReader in =new BufferedReader(new InputStreamReader(sk.getInputStream()));
String data =in.readLine();
System.out.println("客户端消息:"+data);
// //接收二进制字节流
// DataInputStream dis =new DataInputStream(new BufferedInputStream(sk.getInputStream()));
// byte[] enter =new byte[dis.available()];
// dis.read(enter);
//
// //接收对象信息
// ObjectInput ois =new ObjectInputStream(new BufferedInputStream(sk.getInputStream()));
// Object object=ois.readObject();
//输出文本
PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);
out.println(new Date().toString()+":"+data); //服务器返回时间和客户发送来的消息
out.close();
// //输出二进制
// DataOutputStream dos=new DataOutputStream(sk.getOutputStream());
// byte[] back="luanpeng".getBytes();
// dos.write(back);
//
// //输出对象
// ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());
// oos.writeObject(new Date()); //返回一个时间对象
// oos.close();
} catch (Exception e) {
// TODO: handle exception
}
}
//多线程服务器
public static void moreserver(int port){
try {
System.out.println("服务器启动...............");
ServerSocket server=new ServerSocket(port);
while(true)
{
//阻塞,直到有客户连接
Socket sk=server.accept();
//启动服务线程
new ServerThread(sk).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//使用线程为多个客户端服务
class ServerThread extends Thread
{
private Socket sk;
ServerThread(Socket sk)
{
this.sk=sk;
}
//线程运行实体
public void run() {
BufferedReader in=null;
PrintWriter out=null;
try {
InputStreamReader isr;
isr=new InputStreamReader(sk.getInputStream());
in=new BufferedReader(isr);
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);
while(true)
{
//接收来自客户端的请求,根据不同的命令返回不同的信息
String cmd=in.readLine();
System.out.println(cmd);
if (cmd==null) {
break;
}
out.println(new Date().toString()+":"+cmd); //服务器返回时间和客户发送来的消息
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if (in!=null) {
in.close();
}
if (out!=null) {
out.close();
}
if (sk!=null) {
sk.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
tcp客户端代码
package com.lp.app.net;
import java.io.*;
import java.net.*;
//客户端
public class TCPClient {
public static void main(String [] args) throws IOException {
connect("192.168.8.102", 1234);
}
//远程连接
public static void connect(String host,int port){
try {
System.out.println("客户端启动...............");
Socket sock = new Socket(host, port);
// 创建一个写线程
new TelnetWriter(sock.getOutputStream()).start();
// 创建一个读线程
new TelnetReader(sock.getInputStream()).start();
} catch (Exception e) {
// TODO: handle exception
}
}
}
//从控制台读取用户输入命令 线程类
class TelnetWriter extends Thread {
private PrintStream out;
public TelnetWriter(OutputStream out) {
this.out = new PrintStream(out);
}
public void run() {
try {
// 包装控制台输入流
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// 反复将控制台输入写到Telnet服务程序
while (true)
out.println(in.readLine());
} catch (IOException exc) {
exc.printStackTrace();
}
}
}
//将响应数据打印到控制台 线程类
class TelnetReader extends Thread {
private InputStreamReader in;
public TelnetReader(InputStream in) {
this.in = new InputStreamReader(in);
}
public void run() {
try {
// 反复将Telnet服务程序的反馈信息显示在控制台屏幕上
while (true) {
// 从Telnet服务程序读取数据
int b = in.read();
if (b == -1)
System.exit(0);
// 将数据显示在控制台屏幕上
System.out.print((char) b);
}
} catch (IOException exc) {
exc.printStackTrace();
}
}
}