赞
踩
全栈工程师开发手册 (作者:栾鹏)
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(); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。