java socket 基于TCP/IP 协议

Java socket 基于TCP/IP 协议应用

多线程服务器原理:

1、          服务器端创建serversocket并绑定要监听的端口号 ,循环调用serversoket 的accept()方法,等待客户端的连接请求

2、          客户端创建一个socket绑定服务器端的IP地址和服务器监听的端口号并请求和服务器端连接

3、          服务器端接收到客户端的请求后,创建一个socket与客户端建立专线连接

4、          建立连接的两个socket在一个单独的线程上对话

5、          服务器端继续等待新的连接

socket.shutdownOutput();和socket.shutdownInput() 注意区分

注意:客户端向服务器端传送数据的时候大多时候将数据封装成一个对象,而不是本文中使用的字符串

Socket socket = new Socket( "localhost",8888);

OutputStream os =
socket.getOutputStream();

//使用ObjectOutputStream 对象序列化流,传递对象

ObjectOutputStream
objectOutputStream =new ObjectOutputStream(os);

User user = new User("最帅的","123");//将数据封装为user对象

//序列化

objectOutputStream.writeObject(user);

socket.shutdownOutput();

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String info = br.readLine();

while(info != null){

System.out.println("这里是客户端,服务器传来消息:"+info);

info =br.readLine();

传递文件

objectInputStream
clientInputStream = null;

//下载后首先生成一个临时文件

String fileNaemTemp
= "temp.txt";

String downloadPath =
ConfigManager.getInstance(0.getString(Constants.CLIENT_DOWNLOAD_PA

try{

clientInputStream = new ObjectInputStream(clientSocket.getInputStream());

File fileTemp = new File(downloadPath +
"/"+fileNaemTemp);

if(fileTemp.exists()){

fileTemp.delete();

}

fileTemp.createNewFile();

BufferedOutputStream bufferedOutputStream = new
BufferedOutputStream(new FileOutputStream(fileTemp));

//接受服务器的文件

byte []
buf = new byte[1024];

int len;

while((len= clientInputStream.read(buf)) != -1){

bufferedOutputStream.write(buf,0,len);

bufferedOutputStream.flush();

客户端:

import java.net.Socket;

/**

* @描述:客户端

* Created by Jim Calark on 2017/3/17.

*/

public class Client {

public static void main(String[]
args) {

try {

//创建客户端socket,指定服务器IP地址和端口号

Socket 
socket = new Socket("localhost",65533);

//获取socket 输出流

OutputStream os =socket.getOutputStream();

/将字节输出流转为打印流

PrintWriter pw = new PrintWriter(os);

//输出到服务器端

pw.write("你好,我是客户端");

//冲流

pw.flush();

//pw.close()//这里不能关闭输出流,会导致socket也会关闭;关闭socke

//的时候会自动关闭该socket下的输出流

//关闭输出流   
关错了,关到输入流了 告诉服务器端消息发送完毕

//不关闭该输出流的情况下,会一直卡在线程中读取数据那里

socket.shutdownOutput();

//获取 socket输入流,读取服务器端响应信息

InputStream is =socket.getInputStream();

//将字节流转换为字符流,提高读取效率

InputStreamReader isr = new InputStreamReader(is);

//为字符流设立缓冲区

BufferedReader br = new BufferedReader(isr);

String data = null;

//循环读取数据

while((data = br.readLine()) != null){

System.out.println(data);

}

//关闭资源

is.close();

isr.close();

br.close();

pw.close();

socket.close();

} catch
(IOException e) {

e.printStackTrace();

}

}

}

通信线程类

import java.io.*;
import java.net.Socket;

/**
 * @描述:线程服务类
 * Created by Jim Calark on 2017/3/17.
 */

public class ServerThread  extends Thread{
    /** 和本线程有关的socket */
         Socket socket = null;
     //以socket 为参数的构造器
     public ServerThread (Socket socket){
         this.socket = socket;
     }
     //线程执行的操作,响应客户的请求
     public void run(){
        InputStream  is = null;
        OutputStream os = null;
        BufferedReader br = null;
        InputStreamReader isr = null;
        PrintWriter pw =  null;

        try {

            //获取socket中客户端请求的字节输入流
            is = socket.getInputStream();
            //将字节输入流转为字符输入流
            isr = new  InputStreamReader(is);
            //建立缓冲区,提高数据读取效率
            br = new BufferedReader(isr);
            String data = null ;
            //循环读取数据,每次读取一行
            while((data = br.readLine())!= null){
                //打印数据
                System.out.println("客户端传来的消息"+data);
            }
              socket.shutdownInput();//关闭输入流

            //获取输出流响应客户端请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎连接服务器端!");
            pw.flush();//调用flush()方法将缓冲输出

        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
           //关闭资源
            try{
                if(is !=null){
                    is.close();
                }
                if(isr != null){
                    isr.close();
                }
                if(br != null){
                    br. close();
                }
                if ( os !=  null){
                    os.close();
                }
                if(pw != null){
                    pw.close();

                }
                if(socket != null){
                    socket.close();
                }

            }catch (IOException e){
                e.printStackTrace();
            }

        }

    }

服务器端

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @描述:服务器端类
 * Created by Jim Calark on 2017/3/17.
 */
public class Server {
    public static void main(String[] args) {

        try {
            //创建一个服务器端ServerSocket类,绑定要监听的端口号
            ServerSocket serverSocket = new ServerSocket(65533);
            Socket socket = null;
            //记录客户端连接的数量
            int  count = 0;
            System.out.println("**********服务器即将启动,等待客户端的连接********************");
            //循环监听等待客户端的连接
            while(true){
                //调用ServerSocket 的accept() 开始方法监听,等待客户端的连接,一旦连接就创建一个服务器端的Socket
                 socket = serverSocket.accept();
                //为一个新的连接创建一个新线程
                ServerThread serverThread = new ServerThread(socket);
//设置线程的优先级,范围为[1,10],默认为5。未设置优先级可能会导致运行时速度
//非常慢,可降低优先级
serverThread.setPriority(4);
                //启动线程
                serverThread.start();
                count++;
                System.out.println("当前共"+count + "个客户端连接");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
时间: 2024-12-22 03:24:43

java socket 基于TCP/IP 协议的相关文章

java socket 基于UDP/IP 协议

Java  socket 基于UDP/IP协议应用 服务器端:  1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据 4.读取数据 客户端: 1.  定义发送信息: 服务器的IP 端口号  发送的内容 2.  创建DatagramPacket,包含将要发送的信息 3.  创建DatagramSocket 4.  发送数据 服务器端 import java.io.IOException; import java.net.Datagram

基于 TCP/IP 协议的网络编程

在说明基于 TCP/IP 协议的网络编程之前,先来了解一下 Socket(网络套接字): 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准 通信的两端都要有 Socket,是两台机器间通信的端点(API 原话) 网络通信其实就是 Socket 间的通信 Socket 允许程序把网络连接当成一个流,数据在两个 Socket 间通过 IO 传输 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端 网络编程某种程度上可以称作"Socket 编程" T

网络通信-在浏览器输入url,基于TCP/IP协议的解释

知识点1: 网络模型 TCP/IP四层 和ISO七层模型 (统一省略后面层字.比如传输代表传输层) 知识点2: 在应用层中TCP建立连接,经历的三次握手协议 首先:,TCP协议是什么? 为什么要三次握手? 答:TCP协议是面向连接的,而且是点对点的可靠(无差错.不丢失.不重复.按顺序)数据传输服务,他的一些特点,字节流.连接建立后随时传输数据, 其次,握手的目的是在通知对方自己的初始化序号(Initial Sequence Number),简称ISN,保证数据不混乱. 然后: 三次握手的过程是什

使用SOCKET实现TCP/IP协议的通讯

一.原理: 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!一样,TCPIP下建立连接首先要有一个服务器,它是被动的,它只能等待别人跟它建立连接,自己不会去主动连接,那客户端如何去连接它呢,这里提到2个东西,IP地址和端口号,通俗来讲就是你去拜访某人,知道了他的地址是一号大街2号楼,这个是IP地址,那么1号楼这么多门牌号怎么区分,嗯!门牌号就

http、TCP/IP协议与socket之间的区别

网络由下往上分为:  www.2cto.com 物理层-- 数据链路层-- 网络层--                       IP协议 传输层--                       TCP协议 会话层-- 表示层和应用层--           HTTP协议 1.TCP/IP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. 建立起一个TCP连

Http、TCP/IP协议与Socket

网络由下往上分为: 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- TCP协议 会话层-- 表示层和应用层-- HTTP协议 1.TCP/IP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在"无差别"的网络之上. 建立起一个TCP连接需要经过"三次握手": 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态

TCP/IP协议与HTTP协议区别SOCKET接口详解

网络由下往上分为:      物理层--                       数据链路层-- 网络层--                       IP协议 传输层--                       TCP协议 会话层-- 表示层和应用层--           HTTP协议   socket则是对TCP/IP协议的封装和应用(程序员层面上).也可以说,TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/

关于Socket、TCP/IP、HTTP、FTP及网络编程

来源:陶邦仁 链接:http://blog.jobbole.com/99694/ 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,再者如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. 1.1 TCP/IP协议组 TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成. IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机. TCP层负责面向应用的可靠的或非可靠的数据传输机制

聊聊Socket、TCP/IP、HTTP、FTP及网络编程

聊聊Socket.TCP/IP.HTTP.FTP及网络编程 提交 我的留言 加载中 已留言 1 这些都是什么 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. 1.1 TCP/IP协议组 TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成. IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机. TCP层负责面向应