一,了解之前先了解一下网络基础

首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程

一般的网络编程都称为Socket编程,Socket的英文意思是“插座”

网络编程的目的:直接或者间接的通过网络协议与其他计算机进行通信。

网络编程中有两个主要的问题:

-->如何准确定为网络上一台或者多台主机:IP和端口号

-->找到主机后如何可靠搞笑的进行数据传输:Tcp/Ip 协议(四层)

二,网络通信要素

网络通信要素1:IP地址,通过Ip,可以唯一的定为互联网上的一台主机

    ip地址唯一定为一台主机,而端口号定为主机上的某一个正在运行的软件

通讯要素2:网络通信协议TCP/IP协议

三,TCP编程案例1:客户端给服务端发消息,服务端输出此消息到控制台

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str+"\n");
System.out.println("收到来自"+st.getInetAddress().getHostAddress()+"的请求并已回应");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

TCP编程案例2:客户端给服务端发消息,服务端输出此消息到控制台,同时发送已收到信息给客户端

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
InputStream is = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
//声明给服务端发送的东西完毕
socket.shutdownOutput();
//接收服务端的回应
is = socket.getInputStream();
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
OutputStream outputStream = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
// if(st.isInputShutdown()) {
//给予客户端回应
outputStream = st.getOutputStream();
outputStream.write("我已经收到,这是给你(客户端)的回应哦".getBytes());
// }
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

一般关流的时候,遵循从后往前的顺序。

案例3:从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 16:21
*/
//从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接
//注意:本案例中的关流等操作都应该使用try...catch...finally 而不能使用throws Exception 本案例只是为书写方便~

public class socketTomcat {
//客户端
@Test
public void client() throws Exception{
//
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9898);
//
OutputStream outputStream = socket.getOutputStream();
FileInputStream file = new FileInputStream(new File("1.jpg"));
byte[] b = new byte[1024];
int len ;
while((len = file.read(b)) != -1){
outputStream.write(b,0,len);
}
//
socket.shutdownOutput();
//
InputStream inputStream = socket.getInputStream();
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
String str = new String(b1,0,len1);
System.out.println(str);
}
inputStream.close();
outputStream.close();
file.close();
} @Test
public void server() throws Exception{
ServerSocket serverSocket = new ServerSocket(9898);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream file = new FileOutputStream("3.jpg");
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
file.write(b1,0,len1);
} OutputStream outputStream = socket.getOutputStream();
outputStream.write(("来自"+socket.getInetAddress().getHostAddress()+"的图片接收成功").getBytes()); outputStream.close();
file.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}

java之网络编程1-Tcp的更多相关文章

  1. Java:网络编程值TCP的使用

    演示TCP传输   1.Tcp分客户端和服务端 2.客服端对应的对象是scoket    服务端对应的对象是serverscoket   客户端: 通过查阅scoket对象,发现在建立对象时,就可以连 ...

  2. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  3. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  4. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  6. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  7. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  8. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  9. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  10. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

随机推荐

  1. I - 乓 (BFS+邻接表)

    USTC campus network is a huge network. There is a bi-directional link between every pair of computer ...

  2. Pandoanload涅槃重生,小白羊重出江湖?

    Pandoanload涅槃重生,小白羊重出江湖? 科技是把双刃剑,一方面能够砸烂愚昧和落后,另一方面也可能带给人类无尽的灾难. 原子物理理论的发展是的人类掌握了核能技术但是也带来了广岛和长崎的核灾难, ...

  3. 「查缺补漏」巩固你的Nginx知识体系

    Nginx篇 基本介绍 Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试Nginx能够 ...

  4. 文件压缩跟解压(本地&Linux服务器)

    远程解压需要的jar包: <dependency> <groupId>commons-net</groupId> <artifactId>commons ...

  5. sqli-labs 1-10关

    学习sql注入的必做靶场我终于来尝试一下下了. 第一关 ?id=1'时出现 在测试?id=1' and '1'='1,页面正常 ?id=1' and '1'='2  页面错误 判断存在单引号字符型注入 ...

  6. Linux rndis_host 驱动的一个BUG与解决方案

    关键字 rndis_host, linux, kernel, modem 综述 rndis 是微软定义的一套通讯方案.类似的协议还有 qmi/mbim/ecm/ncm. rndis 协议足够简单,可靠 ...

  7. Linux实战(11):Centos安装Jenkins

    前言 本文采用的是yum安装方式. 环境安装 以下操作为配置java8,node,maven,注意装之前请将其他版本删除干净, 离线包下载 tar -zxvf apache-maven-3.6.3-b ...

  8. 如何在 PyPI安装python的软件包?

    安装软件包 本节介绍如何安装Python的基本知识.包裹. 需要注意的是,这个上下文中的“包”一词被用作分布(即要安装的一组软件),而不是指包装在Python源代码中导入(即模块的容器).Python ...

  9. hystrix熔断器之线程池

    隔离 Hystrix有两种隔离方式:信号量和线程池. 线程池隔离:对每个command创建一个自己的线程池,执行调用.通过线程池隔离来保证不同调用不会相互干扰和每一个调用的并发限制. 信号量隔热:对每 ...

  10. Laravel Model查询结果的3种存储格式内存占用对比

    PHP Laravel框架支持Model查询数据后可以有多种方式返回数据,对新手会造成一些困扰,比如数组Model对象.集合.纯数组 今天从内存占用的角度对比一下3种数据返回方式 按数组Model对象 ...