java.net.SketException: সংযোগ পুনরায় সেট করুন


128

সকেট থেকে পড়ার চেষ্টা করে আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি। আমি এটির readInt()উপর একটি কাজ করছি InputStreamএবং আমি এই ত্রুটিটি পাচ্ছি। ডকুমেন্টেশন অনুধাবন করা এ থেকে বোঝা যায় যে সংযোগের ক্লায়েন্ট অংশটি সংযোগটি বন্ধ করে দিয়েছে। এই পরিস্থিতিতে, আমি সার্ভার।

আমার ক্লায়েন্ট লগ ফাইলগুলিতে অ্যাক্সেস রয়েছে এবং এটি সংযোগটি বন্ধ করে দিচ্ছে না, এবং প্রকৃতপক্ষে এর লগ ফাইলগুলি পরামর্শ দেয় যে আমি সংযোগটি বন্ধ করছি। সুতরাং কারও কি ধারণা আছে যে এটি কেন ঘটছে? আর কি চেক করতে হবে? স্থানীয় উত্সগুলি সম্ভবত থ্রেশহোল্ডে পৌঁছে যাওয়ার পরে এটি কি উদ্ভূত হয়?


আমি লক্ষ করি যে আমার নীচের লাইনটি রয়েছে:

socket.setSoTimeout(10000);

ঠিক আগে readInt()। এটির (দীর্ঘ গল্পের) কারণ রয়েছে, তবে কেবল কৌতূহলী, এমন পরিস্থিতি রয়েছে যার ফলে এটি নির্দেশিত ত্রুটির কারণ হতে পারে? আমার আইডিইতে সার্ভারটি চালু রয়েছে এবং আমি আমার আইডিই একটি ব্রেকপয়েন্টে আটকে থাকতে দেখেছি এবং আমি তখন লক্ষ করেছি যে ঠিক একই ত্রুটিগুলি আমার আইডিইতে আমার নিজের লগগুলিতে প্রদর্শিত হতে শুরু করে।

যাইহোক, কেবল এটির উল্লেখ করছি, আশা করি কোনও লাল রঙের হারিং নয়। :-(


আপনি উভয় পক্ষ থেকে স্ট্যাক চিহ্ন আছে? আপনি কি আরও কিছু নেটওয়ার্ক আর্কিটেকচার বর্ণনা করতে পারেন? (বুনো ইন্টারনেটের উপরে? একই মেশিনে? কোথাও কোথাও?) এটি কি সব সময় ঘটে? নাকি মাঝে মাঝে?
স্টু থম্পসন

উত্তর:


116

এর বেশ কয়েকটি সম্ভাব্য কারণ রয়েছে।

  1. অন্য প্রান্তটি ইচ্ছাকৃতভাবে সংযোগটি পুনরায় সেট করেছে, আমি এখানে দলিল করব না এমনভাবে। এটি করার জন্য অ্যাপ্লিকেশন সফ্টওয়্যারটির জন্য এটি বিরল এবং সাধারণত ভুল, তবে বাণিজ্যিক সফ্টওয়্যারটির জন্য এটি অজানা নয়।

  2. আরও সাধারণভাবে, এটি এমন সংযোগে লেখার কারণে ঘটে যা অন্য প্রান্তটি ইতিমধ্যে স্বাভাবিকভাবে বন্ধ হয়ে গেছে। অন্য কথায় একটি অ্যাপ্লিকেশন প্রোটোকল ত্রুটি।

  3. যখন সকেটে অপঠিত ডেটা থাকে বাফারটি পাওয়া যায় তখন এটি সকেট বন্ধ করার কারণেও হতে পারে।

  4. উইন্ডোজে, 'সফ্টওয়্যার কারণে সংযোগ বিলোপ', যা 'সংযোগ পুনরায় সেট' এর মতো নয়, আপনার প্রান্ত থেকে পাঠানো নেটওয়ার্ক সমস্যার কারণে ঘটে। এই সম্পর্কে একটি মাইক্রোসফ্ট জ্ঞান বেস নিবন্ধ আছে।


ধন্যবাদ ম্যাটলায়ন্স এর চেয়ে আরও ভাল এমএসডিএন নিবন্ধ রয়েছে। সত্যিই আমি বিশ্বাস করি যে এটি কঠিন। সঠিক উত্স এবং টার্গেট আইপি অ্যাড্রেসগুলি প্রতিষ্ঠিত না হওয়া পর্যন্ত একটি সংযোগ এমনকি উপস্থিত থাকবে না। আমি যে এমএসডিএন নিবন্ধগুলি দেখেছি সেগুলি সংযোগের সময় নির্ধারিত নেটওয়ার্ক ত্রুটির কথা উল্লেখ করে।
লার্নের মারকুইস

48

সংযোগ পুনরায় সেট করার অর্থ হ'ল একটি টিসিপি আরএসটি প্রাপ্ত হয়েছিল। আপনার পিয়ার এমন ডেটা পান যখন এটি প্রক্রিয়া করতে পারে না, এবং এর বিভিন্ন কারণ থাকতে পারে happens

সবচেয়ে সহজ হ'ল আপনি যখন সকেটটি বন্ধ করেন এবং তারপরে আউটপুট স্ট্রিমে আরও ডেটা লেখেন। সকেটটি বন্ধ করে আপনি আপনার সমবয়সীকে বলেছিলেন যে আপনি কথা বলছেন, এবং এটি আপনার সংযোগটি ভুলে যেতে পারে। আপনি যেভাবে যাইহোক সেই স্ট্রিমটিতে আরও ডেটা প্রেরণ করলে, পিয়ার আপনাকে আরএসটি দিয়ে এটি প্রত্যাখ্যান করে যে আপনাকে শুনছে না তা জানান।

অন্যান্য ক্ষেত্রে, একটি হস্তক্ষেপকারী ফায়ারওয়াল বা এমনকি দূরবর্তী হোস্ট নিজেই আপনার টিসিপি সংযোগটি "ভুলে যেতে" পারে। আপনি যদি কোনও সময়ের জন্য কোনও ডেটা প্রেরণ না করেন তবে এটি ঘটতে পারে (২ ঘন্টা একটি সাধারণ সময়সীমা হয়), বা পিয়ারটি পুনরায় বুট করা হয়েছিল এবং সক্রিয় সংযোগগুলি সম্পর্কিত তথ্য হারিয়ে ফেললে। এই অকার্যকর সংযোগগুলির মধ্যে একটিতে ডেটা প্রেরণের ফলে আরএসটিও হয়ে যাবে।


অতিরিক্ত তথ্যের প্রতিক্রিয়াতে আপডেট করুন:

আপনার পরিচালনা পরিচালনা সম্পর্কে একটি নিবিড় নজর দিন SocketTimeoutException। সকেট ক্রিয়াকলাপে অবরুদ্ধ অবস্থায় কনফিগার হওয়া সময়সীমা অতিক্রম করা হলে এই ব্যতিক্রমটি উত্থাপিত হয়। এই ব্যতিক্রমটি ছুঁড়ে ফেলা হলে সকেটের অবস্থা নিজেই পরিবর্তিত হবে না, তবে যদি আপনার ব্যতিক্রম হ্যান্ডলার সকেটটি বন্ধ করে দেয় এবং তারপরে এটি লেখার চেষ্টা করে, আপনি সংযোগ পুনরায় সেট করার অবস্থায় থাকবেন। setSoTimeout()আপনাকে read()অন্য কোনও থ্রেড থেকে সকেট বন্ধ করার মতো নোংরা কাজ না করে অপারেশন থেকে বেরিয়ে আসার একটি শুদ্ধ উপায় দেওয়ার অর্থ ।


বিভিন্ন ক্ষেত্রে সঠিক নয়। আবর্জনা সংগ্রহ এবং প্রক্রিয়া দুটিই যথাযথ বন্ধ হয়ে যায়, পুনরায় সেট করে না, তবে পিয়ারের একটি লেখার পরে একটি EOS পরিবর্তে পুনরায় সেট করতে পারে। পাঠক একটি পঠনের সময়সীমা নির্ধারণ করা হলেই সকেটটাইমআউটপ্লেসগুলি উত্থাপিত হয়।
মার্চুইস অফ লর্ন

এবং এর অর্থ এই নয় যে কোনও আরএসটি প্রাপ্ত হয়েছিল। এর অর্থ এইও হতে পারে যে একজন এই পাশ দিয়ে তৈরি হয়েছিল।
লার্নের মার্কুইস

17

আমি যখনই এর মতো বিজোড় সমস্যা পেয়েছি, আমি সাধারণত ওয়্যারশার্কের মতো একটি সরঞ্জাম নিয়ে বসে থাকি এবং পিছনে পিছনে কেটে যাওয়া কাঁচা ডেটা দেখি। আপনি বিস্মিত হতে পারেন যেখানে জিনিসগুলি সংযোগ বিচ্ছিন্ন করা হচ্ছে এবং আপনি চেষ্টা এবং পড়ার সময় কেবল আপনাকে অবহিত করা হবে


9

এটি বলতে বিব্রতকর, কিন্তু যখন আমার এই সমস্যাটি হয়েছিল তখন এটি কেবল একটি ভুল ছিল যে আমি সমস্ত ডেটা পড়ার আগে সংযোগটি বন্ধ করে দিচ্ছিলাম। ছোট ছোট স্ট্রিংগুলি ফিরে আসার ক্ষেত্রে এটি কাজ করেছিল, তবে এটি সম্ভবত বন্ধ করার আগে পুরো প্রতিক্রিয়াটি বাফার হয়ে গেছে।

দীর্ঘ পরিমাণে পাঠ্য ফেরতের ক্ষেত্রে ব্যতিক্রমটি ছুঁড়ে দেওয়া হয়েছিল, যেহেতু আরও একটি বাফার ফিরে আসছিল।

আপনি এই তদারকি পরীক্ষা করতে পারেন। মনে রাখবেন কোনও ইউআরএল খোলা কোনও ফাইলের মতো, এটি সম্পূর্ণরূপে পড়া হয়ে গেলে এটি বন্ধ করে (সংযোগটি ছেড়ে দিন) নিশ্চিত হয়ে নিন।


9

আপনি খুব সাবধানে পুরো ট্রেস পরিদর্শন করা উচিত,

আমি একটি সার্ভার সকেট অ্যাপ্লিকেশন করেছি এবং একটি java.net.SocketException: Connection resetকেস ঠিক করেছি ।

আমার ক্ষেত্রে এটি ক্লায়েন্টসকেট Socketঅবজেক্ট থেকে পড়ার সময় ঘটে যা কোনও কারণে এর সংযোগটি বন্ধ হয়ে যায়। (নেটওয়ার্ক হারিয়ে গেছে, ফায়ারওয়াল বা অ্যাপ্লিকেশন ক্র্যাশ হয়েছে বা কাছাকাছি উদ্দেশ্যে)

এই সকেট অবজেক্টটি পড়ার সময় যখন আমি একটি ত্রুটি পেয়েছিলাম তখন আমি পুনরায় সংযোগ স্থাপন করছিলাম।

Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!

মজার বিষয় হ'ল for my JAVA Socketযদি কোনও ক্লায়েন্ট আমার সাথে সংযোগ স্থাপন করে ServerSocketএবং is.read()পুনরাবৃত্তভাবে কোনও কল না প্রেরণ করে তার সংযোগটি বন্ধ করে দেয় seems তবে মনে হয় এই সকেটটি পড়ার জন্য লুপ থাকা অবস্থায় আপনি একটি বদ্ধ সংযোগ থেকে পড়ার চেষ্টা করছেন। আপনি পড়ার অপারেশনের জন্য নীচের মতো কিছু ব্যবহার করেন;

while(true)
{
  Receive();
}

তারপরে আপনি নীচে এবং পরে কিছু স্ট্যাকট্রেস পান

java.net.SocketException: Socket is closed
    at java.net.ServerSocket.accept(ServerSocket.java:494)

আমি যা করেছি তা হ'ল সার্ভারসকেট বন্ধ করে আমার সংযোগটি নবায়ন করা এবং আগত ক্লায়েন্ট সংযোগগুলির জন্য অপেক্ষা করা

String Receive() throws Exception
{
try {                   
            int readed = is.read();
           ....
}catch(Exception e)
{
        tryReConnect();
        logit(); //etc
}


//...
}

এটি অজানা ক্লায়েন্ট সকেট হারানোর জন্য আমার সংযোগটি পুনরায় স্থাপন করে

private void tryReConnect()
        {
            try
            {
                ServerSocket.close();
                //empty my old lost connection and let it get by garbage col. immediately 
                clientSocket=null;
                System.gc();
                //Wait a new client Socket connection and address this to my local variable
                clientSocket= ServerSocket.accept(); // Waiting for another Connection
                System.out.println("Connection established...");
            }catch (Exception e) {
                String message="ReConnect not successful "+e.getMessage();
                logit();//etc...
            }
        }

আমি অন্য কোনও উপায় খুঁজে পেলাম না কারণ নীচের চিত্র থেকে আপনি যেমন দেখতে পেলেন ততক্ষণ আপনি সংযোগটি হারিয়েছেন কিনা তা বুঝতে পারবেন না try and catch, কারণ সবকিছু ঠিক আছে বলে মনে হচ্ছে। আমি Connection resetক্রমাগত পাওয়ার সময় এই স্ন্যাপশটটি পেয়েছি ।

এখানে চিত্র বর্ণনা লিখুন


6

আমারও ত্রুটি ছিল আমি এখন সমস্যার সমাধান খুঁজে পেয়েছি। সার্ভার স্ট্রিমগুলি পড়ার আগে ক্লায়েন্ট প্রোগ্রামটি শেষ হচ্ছিল সমস্যা ছিল।


এটি নিজে থেকে এই ব্যতিক্রম ঘটায় না।
মারকুইস লরনে

এটি হ'ল যদি System.exit (0) প্রোগ্রামটি মেরে ফেলে এবং সংযোগটি খারাপ অবস্থায় থাকে এবং সঠিকভাবে বন্ধ না করা হয় বলে কেউ সকেট.ক্লোজ () কল করে না। সুও আরও সঠিকভাবে বলেছিল যে তার একটি ক্লায়েন্ট প্রোগ্রাম ছিল যা সকেট বন্ধ না করেই শাটডাউন;) যা খারাপ জিনিস এবং এটি ঠিক করা উচিত।
ডিন হিলার

1
পছন্দ করুন অপারেটিং সিস্টেমটি অ্যাপ্লিকেশনটির একইভাবে সকেটটি বন্ধ করে দেবে।
লার্নের মারকুইস

@ ইজেপি .... আমি নিশ্চিত নই ... আমি শুধু জানি আমরা এটি সিস্টেম.এক্সিট দিয়ে পুনরুত্পাদন করতে পারি তবে আমি ওএস / কনফিগারেশনটি মনে করি না যা বেশ কিছুকাল আগে ছিল .... কল করে সকেট.ক্লোজ ( ) সার্ভারে সংযোগ পুনরায় সেট করা রোধ করেছে এবং এটি আরও সঠিকভাবে আচরণ করেছে।
ডিন হিলার

2
@ ডিয়ানহিলার লেখার প্রক্রিয়াটি লেখার প্রক্রিয়া শেষ হওয়ার আগেই পঠন প্রক্রিয়াটি সরে গেছে ।
লার্নের মারকুইস

4

জাভাতে লেখা একটি এসওএ সিস্টেম নিয়ে আমার এই সমস্যা হয়েছিল। আমি বিভিন্ন শারীরিক মেশিনে ক্লায়েন্ট এবং সার্ভার উভয়ই চালিয়ে যাচ্ছিলাম এবং তারা দীর্ঘ সময় ধরে ভাল কাজ করেছে, তারপরে n কদর্য সংযোগের পুনরায় সেটগুলি ক্লায়েন্ট লগটিতে উপস্থিত হয়েছিল এবং সার্ভার লগতে কোনও অদ্ভুত কিছুই ছিল না। ক্লায়েন্ট এবং সার্ভার উভয়ই পুনরায় চালু করা সমস্যার সমাধান করেনি। পরিশেষে আমরা আবিষ্কার করেছি যে সার্ভারের পাশের গাদাটি পূর্ণ ছিল তাই আমরা JVM- তে উপলব্ধ মেমরিটি বাড়িয়ে দিয়েছি: সমস্যার সমাধান! নোট করুন যে লগতে কোনও আউটআফমিউরি অরর ছিল না: মেমরিটি কেবল দুষ্প্রাপ্য ছিল, ক্লান্ত হয়নি।


2

আপনার সার্ভারের জাভা সংস্করণ পরীক্ষা করুন। আমার সাথে ঘটেছিল কারণ আমার ওয়েবলোগিক 10.3.6 টি জেডিকে 1.7.0_75 যা টিএলএসভি 1 তে ছিল। বাকী শেষ পয়েন্টটি আমি ব্যবহার করার চেষ্টা করছিলাম টিএলএসভি 1.2 এর নীচে যে কোনও কিছুই বন্ধ করে দেওয়া হয়েছিল।

ডিফল্টরূপে ওয়েবলগিক সবচেয়ে শক্তিশালী ভাগ করা প্রোটোকল আলোচনার চেষ্টা করছিল। এখানে বিশদটি দেখুন: এইচটিটিপিএস সংযোগের জন্য https.protocols সিস্টেম সম্পত্তি সেট করার সমস্যাগুলি

সমর্থিত টিএলএস সনাক্ত করতে আমি ভার্বোজ এসএসএল লগিং যুক্ত করেছি। এটি নির্দেশিত টিএলএসভি 1 হ্যান্ডশেকের জন্য ব্যবহৃত হচ্ছে।
-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djava.security.debug=access:stack

আমি আমাদের JDK8- সামঞ্জস্যপূর্ণ পণ্যটি, JDK8 টিএলএসভি 1.2-তে ডিফল্ট হিসাবে ফিচারটি ঠেলে দিয়ে সমাধান করেছি। জেডিকে to-তে সীমাবদ্ধদের জন্য, আমি টিএলএসভি ১.২ এ আপগ্রেড করে জাভা for এর জন্য একটি সাফল্যের পরীক্ষাও করেছি tested আমি এই উত্তরটি ব্যবহার করেছি: জাভা 7 তে কীভাবে টিএলএস 1.2 সক্ষম করবেন


অনেক ধন্যবাদ, আপনি আমার সমস্যা সমাধানের জন্য আমাকে একটি নতুন দিক দেখিয়েছেন। এবং অবশেষে আমি এটি কেস পাওয়া !!!
কার্ল লি

1

আমার জাভা প্রোগ্রামটি এসএসএইচ এর মাধ্যমে সার্ভারে একটি কমান্ড প্রেরণের চেষ্টা করেও এই সমস্যা হয়েছিল had সমস্যাটি ছিল জাভা কোডটি কার্যকর করতে মেশিনকে নিয়ে। এটিতে দূরবর্তী সার্ভারে সংযোগ করার অনুমতি ছিল না। লেখার () পদ্ধতিটি ঠিকঠাক কাজ করছিল, তবে পঠন () পদ্ধতিটি একটি জাভা ডটকম ছুড়ে দিচ্ছিল ocketসকেট এক্সেপশন: সংযোগ পুনরায় সেট করুন। দূরবর্তী সার্ভারের পরিচিত কীগুলিতে ক্লায়েন্ট এসএসএইচ কী যুক্ত করে আমি এই সমস্যাটি সমাধান করেছি।


0

আমার অভিজ্ঞতায় আমি প্রায়শই নিম্নলিখিত পরিস্থিতির মুখোমুখি হই;

  1. আপনি যদি কোনও কর্পোরেট সংস্থায় কাজ করেন তবে নেটওয়ার্ক এবং সুরক্ষা টিমের সাথে যোগাযোগ করুন। কারণ বাহ্যিক পরিষেবাগুলিতে করা অনুরোধগুলিতে, প্রাসঙ্গিক শেষ পয়েন্টের জন্য অনুমতি দেওয়ার প্রয়োজন হতে পারে

  2. আর একটি সমস্যা হ'ল এসএসএল শংসাপত্রের সার্ভারে আপনার অ্যাপ্লিকেশনটি চলমান থাকতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.