Java Socket编程之TCP

基于TCP的Socket通信:

服务器端:

  1. 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
  2. 调用accept()方法开始监听,等待客户端的连接
  3. 连接建立后,通过输入流读取客户发送的请求信息
  4. 通过输出流向客户端发送响应信息
  5. 关闭相关资源

客户端:

  1. 创建客户端Socket,指定服务器地址和端口
  2. 连接建立后,通过输出流,向服务器端发送信息
  3. 获取输入流,并读取服务器端的响应信息
  4. 关闭资源

例:服务器端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket=new ServerSocket(8888);
            Socket socket=null;
            //记录客户端的数量
            int count=0;
            System.out.println("***服务器即将启动,等待客户端的连接***");
            //循环监听等待客户端的连接
            while(true){
                //调用accept()方法开始监听,等待客户端的连接
                socket=serverSocket.accept();
                //创建一个新的线程
                ServerThread serverThread=new ServerThread(socket);
                //启动线程
                serverThread.start();
                count++;//统计客户端的数量
                System.out.println("客户端的数量:"+count);
                InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) {
        try {
            //1.创建客户端Socket,指定服务器地址和端口
            Socket socket=new Socket("localhost", 8888);
            //2.获取输出流,向服务器端发送信息
            OutputStream os=socket.getOutputStream();//字节输出流
            PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
            pw.write("用户名:alice;密码:789");
            pw.flush();
            socket.shutdownOutput();//关闭输出流
            //3.获取输入流,并读取服务器端的响应信息
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while((info=br.readLine())!=null){
                System.out.println("我是客户端,服务器说:"+info);
            }
            //4.关闭资源
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器线程处理类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread extends Thread {
    // 和本线程相关的Socket
    Socket socket = null;
        public ServerThread(Socket socket) {
        this.socket = socket;
    }
    //线程执行的操作,响应客户端的请求
    public void run(){
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
            //获取输入流,并读取客户端信息
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            String info=null;
            while((info=br.readLine())!=null){//循环读取客户端的信息
                System.out.println("我是服务器,客户端说:"+info);
            }
            socket.shutdownInput();//关闭输入流
            //获取输出流,响应客户端的请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎您!");
            pw.flush();//调用flush()方法将缓冲输出
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //关闭资源
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用TCP通信传输对象:

ObjectOutputStream oos=new ObjectOutputStream(os);

User user=new User(“admin”,”123”);//封装为对象

oos.writeObject(user);//序列化

Tips:

  优先级问题:serverthread.setPriority();//降低优先级,以防运行速度较慢

输入输出流问题:同一个Socket,关闭输出流则会关闭与之关联的Socket,所以不用关闭输出流,最后关闭Socket即可。

时间: 2024-08-11 01:24:24

Java Socket编程之TCP的相关文章

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

计算机网络Socket编程之TCP协议

>TCP协议位于传输层,是一种面向连接的可靠的传输协议 >socket(套接字):是IP地址与端口号的统称 >套接字的基本结构 struct sockaddr   这个结构用来存储套接字地址 结构体的定义 struct sockaddr { unsigned short sa_family; /* address族, AF_xxx */ har sa_data[14]; /* 14 bytes的协议地址 */ }; sa_family    一般来说,都是"AFINET&quo

Java网络编程之tcp的socket通信

1.客户端MyClient.java 1 import java.io.*; 2 import java.net.*; 3 4 public class MyClient 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.1" , 30000); 9 // 客户端启动ClientThread线程不断读取来自服务器的数据 10 new Th

Java网络编程之TCP通信

一.概述 Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信. Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行server端操作的基础类,该类执行于server,监听入站TCP连接.每一个socketserver监听server的某个port.当远程主机的client尝试连接此port时.server就被唤醒.并返回一个表示两台主机之间socket的正常Socket对象.

[学习笔记]Java网络编程之TCP通讯

1. Socket类 1.1 概述 用于创建客户端套接字,以此建立TCP链接. 1.2 构造器 Socket() Socket(InetAddress address, int port) Socket(String host, int port) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) Socket(String host, int port, InetAddress localAd

Java网络编程之TCP程序设计

在Java中使用Socket(套接字)来完成TCP程序的开发,使用此类可以方便的建立可靠的.双向的.持续的.点对点的通信连接.服务器端使用ServerSocket等待客户端的连接,,而每一个客户端都是用一个Socket对象表示. 1.ServerSocket类与Socket类 ServerSocket类主要运用在服务器端开发,用于接收客户端的连接请求.常用方法: 类型 方法 描述 构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字. Socket accep

Java网络编程之TCP、UDP

Java网络编程提供了两种协议:TCP(传输控制协议)和UDP(数据报协议).TCP(Transmission Control Protocol)是一种可靠的传输协议,传输时会采用"三次握手"端的方式建立连接,以保证数据的可靠性和安全性:而UDP(User Datagram Protocol)协议是一种不可靠的传输协议,发送的数据不一定能够接受的到,网上的聊天是工具一般采用的此协议.下面将详细的接受TCP和UDP的使用以及相应的编码. 一.TCP网络通信 Java中使用Socket(套

Java网络编程之TCP网络编程

一.基于Socket的TCP编程 Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示: 二.客户端Socket的工作过程(四个基本步骤) 1.创建Socket根据指定服务端的IP地址或端口号构造Socket类对象.若服务器端响应,则建立客户端到服务器的通信线路:若连接失败,会出现异常.2.打开连接到Socket的输入出流使用getlnputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输.3.按照一定的协议对Socket

socket编程之TCP/UDP

目标: 1.编写TCP服务端客户端,实现客户端发送数据,服务端接收打印 2.采用OOP方式编写TCP服务端客户端,实现客户端发送数据,服务端添加时间戳,返回给客户端 3.采用OOP方式编写UDP服务端客户端,实现客户端发送数据,服务端添加时间戳,返回给客户端. 1.编写TCP服务端客户端,实现客户端发送数据,服务端接收打印 服务端代码如下: [[email protected] python]# cat tcpserver.py #!/usr/bin/env python # -*- codin